массивы — Как передать динамическое 2-мерное в функцию в переполнение стека

Это допустимый код в соответствии со стандартом c99, и этот фрагмент кода работает нормально на компиляторе gcc.

#include <stdio.h>
void foo( int n, int m, int a[][m]){
//do stuff
}

int main() {
int n,
m;
scanf("%d %d", &n, &m);
int a[n][m];
foo(n, m, a);
return 0;
}

Но эквивалентный код C ++ не работает на компиляторе g ++.

#include <cstdio>
#include <iostream>
using namespace std;
void foo( int n, int m, int a[][m]){
//do stuff
}

int main() {
int n,
m;
cin >> n >> m;
int a[n][m];
foo(n, m, a);
return 0;
}

Я получаю следующую ошибку.

error: use of parameter outside function body before ‘]’ token
void foo( int n, int m, int a[][m]){

Я не могу найти простое решение в C ++, так как оно доступно в C для этой проблемы.

-2

Решение

Прежде всего, вы должны заменить m в int a[][m] с некоторым постоянным значением, поскольку вы не можете использовать переменные для определения столбцов массивов в заголовках функций.

Во-вторых, вы не можете объявить массивы с переменным размером, как вы это сделали int a[n][m], здесь вы также должны использовать константы.

Но если вы хотите использовать массивы переменного размера, вы можете создавать массивы динамически.

int** a = new int*[n]; // It creates an array of pointers of size n

и затем вы можете перебрать этот массив указателей, чтобы выделить массив целых чисел для каждого из указателей.

for (int i = 0; i < n; i++){
a[i] = new int[m];
}

это создаст вам двумерный массив целых чисел динамически.
И чтобы передать этот массив в качестве аргумента какой-либо функции, вы можете использовать указатель на указатель.

void foo(int n, int m, int** a){
// here use it just like you use an array.
}

И когда вы закончите использовать массив, вы должны отменить выделение динамически размещенного массива.

for (int i = 0; i < n; i++){
delete[] a[i];
a[i] = 0;
}
delete[] a;
a = 0;

И если вам не нравится этот метод, вы всегда можете использовать вектор учебный класс.

vector<vector<int>> a(n, vector<int>(m));

Пройти vector к функции.

void foo(const vector<vector<int>>& a){
size_t n = a.size();
size_t m = 0;
if (n > 0)
m = a[0].size();
// do your work
}

Когда используешь vectorвам не нужно беспокоиться о динамическом распределении или vector класс сам обрабатывает подобные вещи.

1

Другие решения

введите описание изображения здесь

Простое решение в C ++ для этой проблемы было бы использовать 2D вектор

vector <vector<int> > vecArray( 10, vector <int> (10) )

и передать его в функцию по ссылке &vec2DArray,

#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;//  function to pass 2d vector array by reference &
void function( int n, int m,  vector <vector<int> > & vec2DArray ) {

for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++  ){

// perform some calculations
vec2DArray[y][x] = (y+1) * (x+1) *m *n;

}
}
}int main() {
cout<<"function to pass 2d vector array by reference & \n\n";

// create a 2D vector of dimension [10][10]
vector <vector<int> > vec2DArray( 10, vector <int> (10) );
int n=0, int m=0;

// call function, pass 2d vector array  by reference &
function( 1, 1, vec2DArray );

// display calculation results
for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++  ){

// display vec2DArray
cout << setfill(' ') << setw(2)<< vec2DArray[y][x] <<" ";
}
cout<<"\n";
}
cout<<"\n";cout<<"Press ANY key to close.\n\n";
cin.ignore(); cin.get();
return 0;
}
0

По вопросам рекламы [email protected]