2015-04-05 169 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