我有一个程序从文件中读取一个二维数组,并使其成为一个锯齿状数组(其中每一行的大小完全适合所有非零元素)。然后它打印出阵列。
但我有几个问题我无法弄清楚。
具体地
26:我收到一个警告(赋值从没有强制转换的指针生成整数
44:错误:下标值既不是数组也不是指针
我该怎么做才能解决它?
int main() {
FILE *inputFile1 = fopen("denseMatrix1.txt", "r");
char inputBuffer[SIZE];
int dim1, dim2, input, i, j;
int *mtrx1;
fgets(inputBuffer, SIZE, inputFile1);
sscanf(inputBuffer, "%d%d", &dim1, &dim2);
mtrx1 = malloc(sizeof(int *) * dim1);
for (i=0; i<dim1; i++) {
int cols=0;
int *row = malloc(sizeof(int) * cols);
fgets(inputBuffer, SIZE, inputFile1);
for (j=0; j<dim2; j++) {
sscanf(inputBuffer, "%d", input);
printf("i=%d j=%d input=%d\n", i, j, input); // ADDED LINE (NOT PRINTING)
if (input) {
cols++;
row = realloc(row, sizeof(int) * cols);
row[cols-1] = input;
}
}
mtrx1[i] = row;
cols=0;
}
int mtrx3[DIM1][DIM2] = {0};
// Prints first 2 matrices
printf("First matrix: \n");
printMatrix(mtrx1, dim1);/*
return 0;
// Prints a 2d array matrix
void printMatrix(int *mtrx, int dim1) {
int i, j;
for (i=0; i<dim1; i++) {
for (j=0; j<(sizeof(mtrx[i]) / sizeof(int)); j++) {
printf("%d ", mtrx[i][j]);
}
printf("\n");
}
printf("\n\n");
文件denseMatrix1.txt的内容:
7 8
0 0 0 5 1 0 0 5
0 0 0 0 0 0 0 0
0 0 0 0 1 2 0 0
1 0 0 0 0 0 0 0
3 0 0 5 0 0 3 0
1 0 0 0 0 3 0 0
0 0 0 0 0 0 0 1
答案 0 :(得分:1)
取代
int *mtrx1;
使用
int **mtrx1;
使用前一个声明,mtrx[i]
评估为int
。您需要将其评估为int*
才能使用:
mtrx1[i] = row;
<强>更新强>
使用fgets
获取一行文字并将文字行与sscanf
一起使用的策略在for
循环中不起作用。
让我们走矩阵的第一行:
0 0 0 5 1 0 0 5
和for
循环:
for (j=0; j<dim2; j++) {
sscanf(inputBuffer, "%d", input);
printf("i=%d j=%d input=%d\n", i, j, input); // ADDED LINE (NOT PRINTING)
if (input) {
cols++;
row = realloc(row, sizeof(int) * cols);
row[cols-1] = input;
}
}
在for
循环中,每次第一行都会0
{@ 1}}。 input
不会存储您第一次阅读的内容,并会从剩下的内容继续。
您需要提出不同的策略。例如:
sscanf
答案 1 :(得分:0)
以下是有问题的一行:
mtrx1[i] = row;
以下是这些变量的声明:
int *mtrx1;
int ..., i, ...;
int *row = ...;
正如您的警告消息所示,您正在尝试获取指针值row
,并将其分配给int
的数组。假设您希望mtrx1
成为单个row
子阵列的数组,则应相应地更改其类型 - 来自int *
,这是int
的数组s,到int **
,这是int
s的数组的数组。
相关代码:
void printMatrix(int *mtrx, int dim1) {
int i, j;
...
printf("%d ", mtrx[i][j]); // line 44
...
}
此行上的错误是与上述问题类似的问题的结果 - mtrx
被声明为int
的一维数组,但在第44行中,您有两个下标,就像它是一个二维数组。通过将mtrx
的类型更改为int **
来解决此问题。
for
循环未能遍历所有值,因为您的sscanf
行不明确 - %d
值之间没有空格,因此sscanf
不能告诉哪个号码应该是哪个,并将它们作为一个值读取。这意味着永远不会正确设置dim2
。
对于这种错误,使用断点通常是了解程序中发生的事情的最简单方法,特别是对于循环。如果你还没有调查它们,你应该这样做。
当您在C中下标数组时,表达式的类型实际上只会删除*
;例如,下标int *
数组的类型为int
。因此,当您尝试将指针指定给int *mtrx1
时,它会将其视为尝试分配指向int
变量的指针,因此指针会转换为其原始数值。这是完全合法的C,但被大多数程序员认为是相当糟糕的做法(由于各种原因),因此编译器会给你一个警告。
第44行是相反的情况 - 您的mtrx[i][j]
表达式等同于(mtrx[i])[j]
。由于mtrx
被定义为int *
,这意味着您有效地最终尝试下标int
,这在C中是非法的。没有警告,只是一个错误。