Передача двумерного массива в функцию C++

Рейтинг: 0Ответов: 1Опубликовано: 07.03.2015

При компиляции выдает следующее:

prog.cpp: In function 'int main()':
prog.cpp:46:37: error: cannot convert 'int (*)[n]' to 'int**' for argument '4' to 'void dfs(int, std::vector<int>&, int, int**)'
     dfs(1, used, n, Adjacency_matrix);
                                     ^

Как я понимаю, проблема с передачей двумерного массива в функцию. Что надо изменить для того, чтобы разрешить проблему? (Код приведен ниже.) Конкретнее: массив Adjacency_matrix передается в функцию dfs.

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

void dfs(int i, std::vector <int> &used, int n, int (&Adjacency_matrix)[n][n]) {
    used[i] = 1;
    for (int j = 0; j < n; ++j) {
        if ((Adjacency_matrix[i][j] == 1) && (used[j] == 0))
            dfs(j, used, n, Adjacency_matrix);
    }
}

double distance(int x1, int y1, int x2, int y2) {
    return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
}

int main() {
    int n, k;
    std::cin >> n >> k;

    int coordinates[n][2];

    for (int i = 0; i < n; ++i) {
        std::cin >> coordinates[i][1];
        std::cin >> coordinates[i][2];
    }

    int Adjacency_matrix[n][n];

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i == j)
                Adjacency_matrix[i][i] = 0;
            if ((i != j) && (distance(coordinates[i][1], coordinates[i][2], coordinates[j][1], coordinates[j][2]) <= k))
                Adjacency_matrix[i][j] = 1;
            if ((i != j) && (distance(coordinates[i][1], coordinates[i][2], coordinates[j][1], coordinates[j][2]) > k))
                Adjacency_matrix[i][j] = 0;
        }
    }

    std::vector <int> used;
    for (int i = 0; i < n; ++i)
        used.push_back(0);

    dfs(1, used, n, Adjacency_matrix);
    for (int i = 0; i < n; ++i) {
        if (used[i] == 0)
            std::cout << "NO";
            exit(0);
    }
    std::cout << "YES";
}

Ответы

▲ 2

В C++ можно выкрутиться вот в таком духе

void f (int n, int *a[])
{
  for (int i = 0; i < n; i++)
    printf("%d\n", a[i][i]); // печатаем диагональ
}

int main (int ac, char *av[])
{
  int n;
  cin >> n;
  int *a[n];
  for (int i = 0; i < n; i++) {
    a[i] = new int[n];
    for (int j = 0; j < n; j++) {
      a[i][j] = i + j; // вообще-то тут инициализируете свою "матрицу"
    }
  }

  f(n, a);

 // в конце надо вручную освобождать память
 for (int i = 0; i < n; i++)
   delete [] a[i];

}