在c ++中将数组作为引用传递

时间:2015-04-05 18:26:06

标签: c++ arrays

我一直在尝试使用2D数组作为函数的Reference。谢谢你的帮助。

#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);
    }
}

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:-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变得很大,这个方法会引起内存问题。

我为自己的搞砸而道歉,打字并没有像我想象的那样奏效。这需要在将2-d数组发送到函数之前将其转换为int指针。我不确定我喜欢这个解决方案,它不是很优雅,但它至少应该编译。

另一方面,我不太确定你尝试使用深度优先搜索做什么,但我不认为这个算法完全符合你的想法(对于一个,malloc没有&# 39; t将它分配的内存归零,这是该算法特别关注的问题)