我有这两个函数,我需要传递table
数组并修改其内容。
void play_game(int mines, int c, int r) {
char (*table)[c][r];
build_field(*table, c, r);
}
void build_field(char *table ,int tamanhox, int tamanhoy) {
int i, x;
for(i=1;i<tamanhoy+1;i++){
table[tamanhoy][tamanhox] = '-';
for(x=0;x<tamanhox-1;x++){
table[tamanhoy][tamanhox] = '-';
}
}
在此代码中,table[tamanhoy][tamanhox]
处出现错误。
答案 0 :(得分:1)
您收到错误是因为您声明参数table
是指向char
的指针,而不是指向数组数组的指针。你也不会让table
实际指向任何地方。
这两个问题都可以通过不使table
成为指向数组数组的指针来解决,并通过更改顺序将参数传递给build_field
函数:
char table[c][r];
build_field(c, r, table);
...
void build_field(int tamanhox, int tamanhoy, char table[][tamanhoy])
{
// Use table like a normal array of array (i.e. table[x][y] = z)
}
您展示的代码还存在其他一些问题,例如您在table[tamanhoy][tamanhox]
函数中始终使用build_field
时可能意味着table[x][i]
。
你也在循环超出函数的范围,请记住索引是从零开始的,因此第一个“维度”的有效索引是0
到tamanhox - 1
(包括)。
答案 1 :(得分:1)
此声明
char (*table)[c][r];
不声明数组。它声明了一个指向char[c][r]
类型对象的指针。顺便说一下为什么不是?:)
char[r][c]
^^^^^
因此在使用此指针之前,应正确初始化。
在此功能声明中
void build_field(char *table ,int tamanhox, int tamanhoy);
第一个参数的类型为char *
。类型char ( * )[c][r]
和类型char *
是不同的不兼容类型。
您可以编写函数声明,例如以下类型
void build_field( int tamanhox, int tamanhoy, char ( *table )[tamanhox][tamanhoy] );
但是在函数内部你必须取消引用指针。例如
( *tablw)[I][j]
确切的参数声明取决于指针的初始化方式以及您要执行的操作。也许你的意思是以下声明
char (*table)[r];
和
void build_field( int tamanhox, int tamanhoy, char ( *table )[tamanhoy] );
编译器发出错误,因为函数参数table
的类型为char *。所以table[I]
是char
类型的标量对象。您可能不会将table[I][x]
等下标运算符应用于它。此外,这个表达
table[tamanhoy][tamanhox]
^^^^^^^^ ^^^^^^^^^
在任何情况下都没有意义,因为至少你应该写
table[i][x]
^^^^^^