Это допустимый код в соответствии со стандартом 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 для этой проблемы.
Прежде всего, вы должны заменить 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
класс сам обрабатывает подобные вещи.
Простое решение в 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;
}