2015-04-05 172 views
-1

我一直在尝试使用一个二维数组作为参考函数。谢谢您的帮助。传递数组作为参考C++

#include <iostream> 
using namespace std; 
void dfs(int *G[],int i,int *visited,int size) { 
    visited[i]=1; 
    int j; 
    for(j=0;j<size;j++) { 
     if(!visited[j]&& G[i][j] == 1) 
      dfs(G,j,visited); 
    } 
} 
+0

@mello我认为最后一个地址正是你的问题。 – vsoftco 2015-04-05 18:44:09

+0

两者都可以,你得到这个问题的原因是因为静态/动态数组不匹配,这个问题已经在两个链接的答案中得到了解答。 – 2015-04-05 18:44:46

回答

1

的问题是在你的dfs功能的签名

void dfs(int *G[],int i,int *visited) 

它需要一个指向指针int。但您可将数组传递给它

dfs(Array_From_file, 0, visited); 

其中Array_From_file被声明为

int Array_From_file[ROWS][COLUMNS]; 

这种转换是不可能的。快速修复:该函数的签名改为:

void dfs(int G[][COLUMNS],int i,int *visited) 

更好,使用您通过引用传递一个std::vector<std::vector<int>>。这里有一个例子:

#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

int const COLUMNS = 100; 
int const ROWS = 100 ; 
typedef std::vector<std::vector<int>> int_mat; 

void dfs(const int_mat& G, int i, vector<int>& visited) { 
    int size = ROWS * COLUMNS ; 
    visited[i] = 1; 
    for (int j = 0; j < size; j++) { 
     if (!visited[j] && G[i][j] == 1) 
      dfs(G, j, visited); 
    } 
} 
+0

所以我应该改变无效的PDF格式(INT G [] [],INT我,INT *访问) – mello 2015-04-05 18:40:41

+0

你应该改变签名为'void(int G [] [COLUMNS],int,int *)'必须指定第二维),或者使用'int ** Array_from_file'。 – vsoftco 2015-04-05 18:42:34

+0

所以我应该把int大小变量放到函数中,并且用一个嵌套的循环来放置一个嵌套的for循环,用const max right – mello 2015-04-05 18:47:29

-1

我相信你的(大量编辑)修复是这样的:

int one_to_two(int* a, int x, int y) 
{ 
    return a[x*ROWS+y]; 
} 
void dfs(int** G,int i,int *visited) { 
    int size = ROWS * COLUMNS ; 
    visited[i]=1; 
    int j; 
    for(j=0;j<size;j++) { 
     if(!visited[j]&& one_to_two(G,i,j) == 1) 
      dfs(G,j,visited); 
    } 
} 

话虽这么说,我不认为这是解决这个的一个结构良好的方法问题。我不知道你为什么使用递归来做到这一点,迭代循环会简单得多。这种方法有可能炸毁堆栈。这里你没有使用尾递归,所以如果ROWS或COLUMNS变得非常大,这个方法会导致内存问题。

我对我的错误表示歉意,打字没有像我认为的那样工作。这将需要将您的二维数组转换为一个int指针,然后将其发送到函数中。我不确定我喜欢这个解决方案,它不是很优雅,但至少应该编译。

在另一个说明中,不太清楚你想用深度优先搜索做什么,但我不认为这个算法完全符合你的想法(比如,malloc不会将它分配的内存,这是该算法特别关注)

+0

这声明'G'作为一个引用数组,这是一个错误(在编译时捕获) – vsoftco 2015-04-05 18:48:22

+0

刚刚发生...程序崩溃..你有任何的拒绝?请 – mello 2015-04-05 18:49:18

+0

只是改变它。我认为这个参考文件会起作用,但它不会。双指针应该可以做到这一点。 – 2015-04-05 18:51:17