как передать динамический массив 2d в функцию без использования указателей?

Я пробовал это, но это не работает! может ли кто-нибудь помочь мне, пожалуйста, это очень важно :(

#include <iostream>
using namespace std;
int a[100][100];

void read(int a[][100],int n)
{
  int i,j;
  for(i=0;i<n;i++)
       for(j=0;j<n;j++)
     cin>>a[i][j];
}

int main ()
{
    int n;
    cin>>n;
    int a[n][n];
   read(a,n);
}

person Amna Alnajjar    schedule 05.05.2017    source источник
comment
int a[n][n]; - это VLA, а не стандартный C++.   -  person Jarod42    schedule 05.05.2017
comment
Вы должны переключить параметры. Если вы пишете int n раньше, вы можете использовать значение в размере массива: void read(int n, int a[][n])   -  person mch    schedule 05.05.2017
comment
У вас есть противоречивые объявления a[][]   -  person Rohan Kumar    schedule 05.05.2017
comment
Это c++. Почему бы вам не использовать std::vector? Он создан именно для таких случаев.   -  person alexeykuzmin0    schedule 05.05.2017
comment
@RohanKumar все a находятся в разных областях, поэтому конфликта нет.   -  person mch    schedule 05.05.2017
comment
Я пробовал это и раньше писал int n, но это не работает @mch   -  person Amna Alnajjar    schedule 05.05.2017
comment
@AmnaAlnajjar: вы можете использовать векторы.   -  person Rohan Kumar    schedule 05.05.2017
comment
@alexeykuzmin0 я еще студент, мы еще не изучали это   -  person Amna Alnajjar    schedule 05.05.2017
comment
Почему у вас есть и локальная (в main), и глобальная переменная a[][]?   -  person Jonas    schedule 05.05.2017
comment
спасибо ребята за помощь!!   -  person Amna Alnajjar    schedule 05.05.2017


Ответы (2)


Непонятный синтаксис для передачи массива по ссылке:

void read(int (&a)[100][100], int n)

в результате чего

#include <iostream>

void read(int (&a)[100][100], int n)
{
  for(int i = 0; i < n; i++)
       for(int j = 0; j < n; j++)
           std::cin >> a[i][j];
}

int main ()
{
    int n;
    std::cin >> n;
    int a[100][100];
    read(a, n);
}

но вы можете предпочесть std::vector:

#include <iostream>
#include <vector>

void read(std::vector<std::vector<int>> &mat)
{
    for (auto& v : mat) {
        for (auto& e : v) {
            std::cin >> e;
        }
    }
}

int main ()
{
    int n;
    std::cin >> n;
    std::vector<std::vector<int>> mat(n, std::vector<int>(n));
    read(mat);
}
person Jarod42    schedule 05.05.2017
comment
да, я попробую это - person Amna Alnajjar; 05.05.2017

Так как это помечено C++. Я хотел бы предложить использовать std::vector. Это динамический контейнер, который очень полезен. Вы можете изменить его размер, очистить его, заполнить его с легкостью. Как только вы поймете его базовое использование, они пригодятся вам в вашей будущей разработке C++. Я немного изменил ваш код:

#include <iostream>
#include <vector>
using namespace std;

void read(vector<vector<int> >& arr,int n)
{
  int i,j;
  for(i=0;i<n;i++)
       for(j=0;j<n;j++)
           cin>>arr[i][j];
}
int main ()
{
    int N;
    cin>>N;
    vector<vector<int> > arr(N, vector<int>(N));
    read(arr, N);
}

У них есть много преимуществ перед примитивными массивами, например, их можно легко инициализировать, предположим, вы хотите инициализировать все до нуля:

vector<vector<int> > arr(N, vector<int>(N, 0));

Вам не нужно беспокоиться о добавлении размера массива при передаче функций. вектор может легко справиться с этим:

for(i = 0; i < arr.size(); i++) {
  for(j = 0; j < arr[i].size(); j++) {
    // do stuff
  }
}

Кроме того, с добавленными методами стандартной библиотеки шаблонов, такими как fill, swap. Многие операции выполняются легко.

person Rohan Kumar    schedule 05.05.2017