我试图将文件发送到一个函数,该函数创建一个名为Entry的结构矩阵,根据文件填充它,然后返回矩阵。现在它是一系列错误,我可以根据需要添加,但我怀疑我只是犯了多个愚蠢的错误。如果有一种更简单的方式不涉及malloc,那也可以。
我做错了什么,我该怎么做呢?
以下是相关代码:
Entry **matCreate(FILE *fp){
// initialize matrix
Entry matrix = malloc(states * N_CC * sizeof(Entry));
// populate the matrix with initial values
for (int i = 0; i < states; i++) {
for (int j = 0; j < N_CC; j++) {
matrix[i][j].next = 99;
matrix[i][j].action = "D";
}
}
return matrix;
}
并在主要功能中:
Entry **matrix = matCreat(fp);
我用
关闭了这个功能Entry **matCreate(FILE *fp){
使用
初始化它Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );
用以下内容填充:
for (int i = 0; i < states; i++) {
for (int j = 0; j < N_CC; j++) {
matrix[i][j].next = 99;
matrix[i][j].action = "D";
}
}
从以下主题获取: 输入ourMat =(* matCreate(fp))[N_CC];
但仍然收到错误: tokenize.c:84:1:警告:从不兼容的指针类型返回[默认启用]
我哪里错了?
答案 0 :(得分:2)
C没有真正的多维数组类型。您必须返回锯齿状数组,或返回数组数组。 (此外,由于数组不能按值返回;在这两种情况下,您必须动态分配数组,并返回指向它的指针)。 Further reading
对于数组数组选项,您可以像这样声明和分配它:
Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );
通过将此模式用于malloc的参数,您可以避免担心任何复杂的内容。
返回此指针的函数类型为:
Entry (*matCreate(FILE *fp))[N_CC];
在调用代码中,您可以使用如下函数:
Entry (*matrix)[N_CC] = matCreate(fp);
bar( matrix[1][2].action );
您可以使用typedef来制作所有这些更简单的语法。我个人不喜欢,因为当阵列指针衰减发生时,它就不那么明显了。
答案 1 :(得分:2)
您需要将 malloc 返回指针分配给Entry **
Entry **matrix;
matrix= (Entry**)malloc(states * sizeof(Entry *));
for (i = 0; i < states; i++)
Entry[i] = malloc(N_CC * sizeof(Entry));