2015-04-05 2 views
-1

Я пытаюсь использовать 2D-массив как ссылку в функцию. Спасибо за помощь.Передача массива в качестве ссылки в 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

+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); 
    } 
} 
+0

поэтому я должен изменить void pdfs (int G [] [], int i, int * visitded) – mello

+0

вы должны либо сменить подпись на 'void (int G [] [COLUMNS], int, int *)' (вы необходимо указать второе измерение) или использовать 'int ** Array_from_file'. – vsoftco

+0

поэтому я должен взять переменную int size в функцию и поместить вложенный цикл с константой const max – mello

-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-мерного массива указателю int перед его отправкой в ​​функцию. Я не уверен, что мне нравится это решение, оно не очень элегантное, но оно должно, по крайней мере, скомпилировать.

На другой ноте, не совсем уверен, что вы пытаетесь сделать с поиском глубины, но я не думаю, что этот алгоритм делает то, что вы думаете, что он делает (например, malloc не равен нулю память, которую он выделяет, что вызывает особую озабоченность этим алгоритмом)

+0

это объявляет 'G' как массив ссылок, что является ошибкой (пойманной во время компиляции) – vsoftco

+0

, которая только что произошла ... программа разбилась .. У вас есть какие-либо подходы? Пожалуйста, – mello

+0

Просто изменил его. Я думал, что эта ссылка будет работать, а это не так. Хотя двойной указатель должен сделать трюк. –

Смежные вопросы