我正在尝试编译这个长代码,但是得到了很多我不理解的错误,这里是代码:(我知道它的代码非常长而且有很多错误,但我觉得很难解决它,试过所有的日子都没有成功)
#include<stdio.h>
#include<stdlib.h>
struct Data
{
int i,j,n;
}typedef Data_t;
struct Next
{
Data_t d;
Next_t* next;
}typedef Next_t;
void printMatrix(int** m,int r,int c)
{
int i,j;
printf("Matrix created is:\n");
for (i=0 ; i<r ; i++)
{
for( j=0 ; j<c ; j++)
{
printf("%d\t",m[(i*r)+j]);
}
printf("\n");
}
}
int calcMatrix(int** m,int r,int c,Next_t** d,Data_t** arr)
{
int i,j,counter=0;
printf("Enter values to the Matrix: \n");
for (i=0; i<r ; i++)
{
printf("Enter values to row #%d: ",i+1);
for(j=0; j<c ; j++)
{
scanf("%d",&m[(i*r)+j]);
}
}
printMatrix(m,r,c);
Next_t* temp1,*temp2;
for (i=0; i<r ; i++)
{
for (j=0 ; j<c ; j++)
{
if (m[i][j] == i+j)
{
counter++;
temp1 = (Next_t*)malloc(sizeof(Next_t));
temp1->d.n = m[i][j];
temp1->d.i = i;
temp1->d.j = j;
temp1->next = NULL;
if (*d == NULL) //add new triplet to the list
*d = temp1;
else
{
temp2 = *d;
while (temp2->next != NULL)
temp2 = temp2->next;
temp2->next = temp1;
}
}
}
}
if (counter!=0)
{
*arr = (Data_t*)malloc(counter*sizeof(Data_t));
temp2 = *d;
for (i = 0; i < counter;i++)
{
(*arr)[i] = temp2->d;
temp2 = temp2->next;
}
}
return counter;
}
void main()
{
int r,c,**m,solution;
int i;
Next_t** d;
Data_t** arr;
printf("Please enter number of rows for Matrix: ");
scanf("%d",&r);
printf("Please enter number of cols for Matrix: ");
scanf("%d",&c);
m = (int**)malloc(r*(sizeof(int*)));
for (i=0 ; i<c ; i++)
{
m[i] = (int*)malloc(c*(sizeof(int)));
}
solution = calcMatrix(m,r,c,d,arr);
printf("Size of Array Is: %d",solution);
}
我收到的错误如下:
matala0103.c(13): error C2061: syntax error : identifier 'Next_t'
matala0103.c(14): error C2059: syntax error : '}'
matala0103.c(30): error C2143: syntax error : missing ')' before '*'
matala0103.c(30): error C2081: 'Next_t' : name in formal parameter list illegal
matala0103.c(30): error C2143: syntax error : missing '{' before '*'
matala0103.c(30): error C2371: 'Data_t' : redefinition; different basic types
matala0103.c(8) : see declaration of 'Data_t'
matala0103.c(30): error C2143: syntax error : missing ';' before '*'
matala0103.c(30): error C2059: syntax error : ')'
matala0103.c(31): error C2054: expected '(' to follow 'arr'
\matala0103.c(89): error C2065: 'Next_t' : undeclared identifier
matala0103.c(89): error C2297: '*' : illegal, right operand has type 'int *'
matala0103.c(90): error C2275: 'Data_t' : illegal use of this type as an expression
matala0103.c(8) : see declaration of 'Data_t'
非常感谢能帮助我的人! 伊泰。
答案 0 :(得分:0)
查看输出的第一个警告或错误通常很有帮助,因为后来的错误通常是由第一个问题引起的多米诺链问题的结果。在这种情况下,第一个错误是
matala0103.c(13):错误C2061:语法错误:标识符'Next_t'
意味着编译器无法弄清楚Next_t
的含义。这是因为在实际定义它之前你正在引用它;在这个时间点,编译器不知道Next_t是什么。如果将类型更改为编译器看到的类型,例如struct Next_t* next;
,它将更好地工作。
答案 1 :(得分:-1)
有很多错误:
typedef
在完成之前是未定义的。定义struct Next
时,尚未定义类型Next_t
。所以你必须参考struct Next
d
和arr
旨在从sub获取值。您必须将它们定义为结构的指针,但是将指针传递给该函数以便函数可以修改值。但是你将它们定义为指针的指针。d
显式初始化为NULL,但是在代码中将其检查为null。请参阅下面的代码,它使用增强的C99和C11来动态创建数组引用(我不使用我喜欢的方法因为它不常用,但也因为这里没有真正意义上的维度总是未知的。)
#include<stdio.h>
#include<stdlib.h>
struct Data
{
int i,j,n;
} typedef Data_t;
struct Next
{
Data_t d;
struct Next* next; //Next_t is undefined here. Use 'struct Next'.
} typedef Next_t;
void printMatrix(int* m,int r,int c)
{
int (*matrix)[c] = (int (*)[c])m; //Create a pointer to an array of array of int having first dimension = 'c'
int i,j;
printf("Matrix created is:\n");
for (i=0 ; i<r ; i++)
{
for( j=0 ; j<c ; j++)
{
printf("%d\t",matrix[i][j]);
}
printf("\n");
}
}
int calcMatrix(int* m,int r,int c,Next_t** d,Data_t** arr)
{
int (*matrix)[c] = (int (*)[c])m; //Create a pointer to an array of array of int having first dimension = 'c'
int i,j,counter=0;
printf("Enter values to the Matrix:\n");
for (i=0; i<r ; i++)
{
printf("Enter values to row #%d:\n",i+1);
for(j=0; j<c ; j++)
{
scanf("%d",&matrix[i][j]);
}
}
printMatrix(m,r,c);
Next_t* temp1,*temp2;
for (i=0; i<r ; i++)
{
for (j=0 ; j<c ; j++)
{
if (matrix[i][j] == i+j)
{
counter++;
temp1 = malloc(sizeof(Next_t));
temp1->d.n = matrix[i][j];
temp1->d.i = i;
temp1->d.j = j;
temp1->next = NULL;
if (*d == NULL) //add new triplet to the list
*d = temp1;
else
{
temp2 = *d;
while (temp2->next != NULL)
temp2 = temp2->next;
temp2->next = temp1;
}
}
}
}
if (counter!=0)
{
*arr = malloc(counter*sizeof(Data_t));
temp2 = *d;
for (i = 0; i < counter; i++)
{
(*arr)[i] = temp2->d;
temp2 = temp2->next;
}
}
return counter;
}
int main(int argc, char *argv[])
{
int r,c,*m,solution;
Next_t* d = NULL; //declare as a pointer and init to NULL
Data_t* arr = NULL; //declare as a pointer and init to NULL
printf("Please enter number of rows for Matrix: ");
scanf("%d",&r);
printf("Please enter number of cols for Matrix: ");
scanf("%d",&c);
m = malloc(r*c*(sizeof(int)));
solution = calcMatrix(m,r,c,&d,&arr); //pass d and arr by reference so they can be updated
printf("Size of Array Is: %d\n",solution);
if (solution)
{
printf("Array content;\n");
for (int i=0; i<solution; i++)
printf("\t%d) i=%d, j=%d, n=%d\n", i, arr[i].i, arr[i].j, arr[i].n);
printf("Next structures content;\n");
for (Next_t* p = d; p; p= p->next)
{
printf("\ti=%d, j=%d, n=%d, next=0x%p\n", p->d.i, p->d.j, p->d.n, p->next);
if (! p->next)
break;
}
}
}
输出结果为:
Please enter number of rows for Matrix: 2
Please enter number of cols for Matrix: 3
Enter values to the Matrix:
Enter values to row #1:
0
1
2
Enter values to row #2:
1
2
3
Matrix created is:
0 1 2
1 2 3
Size of Array Is: 6
Array content;
0) i=0, j=0, n=0
1) i=0, j=1, n=1
2) i=0, j=2, n=2
3) i=1, j=0, n=1
4) i=1, j=1, n=2
5) i=1, j=2, n=3
Next structures content;
i=0, j=0, n=0, next=0x00b803bc
i=0, j=1, n=1, next=0x00b803d4
i=0, j=2, n=2, next=0x00b803ec
i=1, j=0, n=1, next=0x00b80404
i=1, j=1, n=2, next=0x00b8041c
i=1, j=2, n=3, next=0x00000000
Press any key to continue...
这是C90和之前编译器的版本:
#include<stdio.h>
#include<stdlib.h>
struct Data
{
int i,j,n;
} typedef Data_t;
struct Next
{
Data_t d;
struct Next* next;
} typedef Next_t;
void printMatrix(int* m,int r,int c)
{
//int (*matrix)[c] = (int (*)[c])m;
int i,j;
printf("Matrix created is:\n");
for (i=0 ; i<r ; i++)
{
for( j=0 ; j<c ; j++)
{
//printf("%d\t",matrix[i][j]);
printf("%d\t",m[i*c+j]);
}
printf("\n");
}
}
int calcMatrix(int* m,int r,int c,Next_t** d,Data_t** arr)
{
//int (*matrix)[c] = (int (*)[c])m;
int i,j,counter=0;
printf("Enter values to the Matrix:\n");
for (i=0; i<r ; i++)
{
printf("Enter values to row #%d:\n",i+1);
for(j=0; j<c ; j++)
{
//scanf("%d",&matrix[i][j]);
scanf("%d",&m[i*c+j]);
}
}
printMatrix(m,r,c);
Next_t* temp1,*temp2;
for (i=0; i<r ; i++)
{
for (j=0 ; j<c ; j++)
{
//if (matrix[i][j] == i+j)
if (m[i*c+j] == i+j)
{
counter++;
temp1 = (Next_t*)malloc(sizeof(Next_t));
//temp1->d.n = matrix[i][j];
temp1->d.n = m[i*c+j];
temp1->d.i = i;
temp1->d.j = j;
temp1->next = NULL;
if (*d == NULL) //add new triplet to the list
*d = temp1;
else
{
temp2 = *d;
while (temp2->next != NULL)
temp2 = temp2->next;
temp2->next = temp1;
}
}
}
}
if (counter!=0)
{
*arr = malloc(counter*sizeof(Data_t));
temp2 = *d;
for (i = 0; i < counter; i++)
{
(*arr)[i] = temp2->d;
temp2 = temp2->next;
}
}
return counter;
}
int main(int argc, char *argv[])
{
int r,c,*m,solution;
Next_t* d = NULL;
Data_t* arr = NULL;
printf("Please enter number of rows for Matrix: ");
scanf("%d",&r);
printf("Please enter number of cols for Matrix: ");
scanf("%d",&c);
m = malloc(r*c*(sizeof(int)));
solution = calcMatrix(m,r,c,&d,&arr);
printf("Size of Array Is: %d\n",solution);
if (solution)
{
printf("Array content;\n");
for (int i=0; i<solution; i++)
printf("\t%d) i=%d, j=%d, n=%d\n", i, arr[i].i, arr[i].j, arr[i].n);
printf("Next structures content;\n");
//Next_t* p = d;
for (Next_t* p = d; p; p= p->next)
{
printf("\ti=%d, j=%d, n=%d, next=0x%p\n", p->d.i, p->d.j, p->d.n, p->next);
if (! p->next)
break;
} //while (p->next);
}
}
请检查不要使用损坏的编译器:-D