C、 为什么函数不接受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_

这是我的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_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接受所有这些组合。这是一个错误吗?上面的常量想法很有趣,但是如果我第一次阅读它,我更喜欢这种方式。上面的常量想法很有趣,但是如果我第一次阅读它,我更喜欢这种方式。