C、 为什么函数不接受txt文件中的2d数组作为参数?
这是我的C代码和.txt文件。我想使用.txt文件中的2d数组作为函数参数。但是,当我运行此代码时,程序在调用函数行中给出错误,例如:C、 为什么函数不接受txt文件中的2d数组作为参数?,c,C,这是我的C代码和.txt文件。我想使用.txt文件中的2d数组作为函数参数。但是,当我运行此代码时,程序在调用函数行中给出错误,例如: [Error] cannot convert 'int (*)[C]' to 'int (*)[3]' for argument '1' to 'int rec_ped(int (*)[3], int)'. 换句话说,我的函数rec_ped无法接受.txt文件中的2d数组 你能帮我一下吗 #include <stdio.h> int rec_
[Error] cannot convert 'int (*)[C]' to 'int (*)[3]' for argument '1' to 'int rec_ped(int (*)[3], int)'.
换句话说,我的函数rec_ped无法接受.txt文件中的2d数组
你能帮我一下吗
#include <stdio.h>
int rec_ped(int k[18][3], int idx) {
int sire, dam;
sire = k[idx - 1][1];
dam = k[idx - 1][2];
printf("%d ", sire);
if (sire != 0)
rec_ped(k, sire);
if (dam != 0)
rec_ped(k, dam);
}
int main() {
int R = 18;
int C = 3;
int A[R][C];
FILE *fp;
int i, j;
fp = fopen("t.txt", "r");
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
fscanf(fp, "%d", &A[i][j]);
}
}
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
A[i][j];
rec_ped(A, 18); // <--- there is error!!!
}
}
return 0;
}
当数组衰减为指针时,它仅应用于最外层的数组维度。它不适用于内部尺寸。所以int*[3]和int*[C]是不一样的,即使调用函数时C恰好是3。在这种情况下,不能将固定大小数组和可变长度数组视为相同 但是,您可以将数组的维度作为参数传递:
int rec_ped(int rows, int cols, int k[rows][cols], int idx) {
然后你可以这样称呼它:
rec_ped(R, C, A, 18);
当数组衰减为指针时,它仅应用于最外层的数组维度。它不适用于内部尺寸。所以int*[3]和int*[C]是不一样的,即使调用函数时C恰好是3。在这种情况下,不能将固定大小数组和可变长度数组视为相同 但是,您可以将数组的维度作为参数传递:
int rec_ped(int rows, int cols, int k[rows][cols], int idx) {
然后你可以这样称呼它:
rec_ped(R, C, A, 18);
使C为常数定义c3
问题是:如果C不是常量,而是变量,它可能在声明数组之前被修改过,所以后者实际上是一个VLA。相反,函数需要一个固定大小的数组,因此类型不匹配
请注意,您不必使R为常数:
int rec_ped(int k[18][3], int idx);
相当于
int rec_ped(int k[][3], int idx);
int rec_ped(int (*k)[3], int idx);
这相当于
int rec_ped(int k[][3], int idx);
int rec_ped(int (*k)[3], int idx);
一,。E该函数实际上接受一个指向长度为3的数组的指针,就像void fint*;接受指向int的指针。在这两种情况下,指针可以分别引用数组或int数组的第一个元素,也可以仅引用单个元素…将C设为常量定义c3
问题是:如果C不是常量,而是变量,它可能在声明数组之前被修改过,所以后者实际上是一个VLA。相反,函数需要一个固定大小的数组,因此类型不匹配
请注意,您不必使R为常数:
int rec_ped(int k[18][3], int idx);
相当于
int rec_ped(int k[][3], int idx);
int rec_ped(int (*k)[3], int idx);
这相当于
int rec_ped(int k[][3], int idx);
int rec_ped(int (*k)[3], int idx);
一,。E该函数实际上接受一个指向长度为3的数组的指针,就像void fint*;接受指向int的指针。在这两种情况下,指针可以分别引用数组或int数组的第一个元素,也可以仅引用单个元素…您使用的编译器和版本是什么?您的函数原型指定int[18][3],但您传递的数组长度不同。快速修复:更改int a[R][C];至int A[18][3];。A[i][j];在嵌套循环中没有效果/没有任何作用。这是C代码…您使用的编译器和版本是什么?您的函数原型指定int[18][3],但您传递的数组长度不同。快速修复:更改int A[R][C];至int A[18][3];。A[i][j];在嵌套循环中没有任何效果/没有任何作用。这是C代码…使C成为常量将像定义C 3一样工作。你是说常数C=3;?后者在C中不起作用。@chux真的吗???GCC接受罚款,这是一个扩展吗?在我现在开始搜索我自己之前,您是否碰巧有适当的参考标准可用?如答案所示。int*[3]和int*[C]不一样。常数int C=3;常数R=18;int A[R][C];,A仍然是VLA。尝试常量int C=3和int rec_pedint k[18][4],int idx。GCC是否在C中出错?这个断开的来源可能是在C中,const不是常数,如C++中的常数。@ CHUX怪异,GCC接受所有这些组合。这是一个错误吗?使C成为常数就像定义C3一样。你是说常数C=3;?后者在C中不起作用。@chux真的吗???GCC接受罚款,这是一个扩展吗?在我现在开始搜索我自己之前,您是否碰巧有适当的参考标准可用?如答案所示。int*[3]和int*[C]不一样。常数int C=3;常数R=18;int A[R][C];,A仍然是VLA。尝试常量int C=3和int rec_pedint k[18][4],int idx。GCC是否在C中出错?这个断开的来源可能是在C中,const不是常数,如C++中的常数。@ CHUX怪异,GCC接受所有这些组合。这是一个错误吗?上面的常量想法很有趣,但是如果我第一次阅读它,我更喜欢这种方式。上面的常量想法很有趣,但是如果我第一次阅读它,我更喜欢这种方式。