根据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 ++中找到这个问题的简单解决方案。
答案 0 :(得分:1)
首先,您必须使用某个常量值替换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];
}
这将动态创建一个2D整数数组。 要将此数组作为参数传递给某个函数,可以使用指针指针。
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<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 :(得分:0)
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;
}