【发布时间】:2011-05-09 22:29:25
【问题描述】:
几天来,我一直在仔细研究与我类似的问题,但仍未找到解决方案。感谢任何帮助:
我有两个文件,一个包含处理有理数的方法,另一个包含在二维数组中处理它们的方法。我的问题是 matrix.c 无法识别 fraction.c 中包含的分数结构。我相信我的问题与我声明二维数组的方式有关。
在分数.c 中:
struct fraction {
int integer;
int num;
int den;
};
typedef struct fraction* fractionRef; //This line is in fraction.h
在matrix.c中:
#include "fraction.h"
typedef struct matrix* matrixRef;
struct matrix {
int rows;
int columns;
fractionRef *m;
}matrix;
matrixRef new_matrix ( int rows, int columns ) {
matrixRef matrix;
matrix = (matrixRef)malloc( sizeof( matrix ) );
matrix->m = (fractionRef*)calloc( rows, sizeof( fractionRef ) );
int i;
for ( i=0; i<=rows; i++ )
matrix->m[i] = (fractionRef)calloc( columns, sizeof( fractionRef ) );
assert( matrix->m );
return matrix;
}
void free_matrix ( matrixRef freeMe ) {
if ( freeMe != NULL ){
int i, j;
for( i = 0; i <= freeMe->rows; i++ ){
for ( j = 0; j <= freeMe->columns; j++ ){
free_fraction( freeMe->m[i][j] ); //ERROR OCCURS HERE
}
}
freeMe->rows = 0;
freeMe->columns = 0;
free(freeMe);
freeMe = NULL;
}
}
我得到的错误对应matrix.c中我标记的行。
matrix.c:47: error: invalid use of undefined type ‘struct fraction’
matrix.c:47: error: dereferencing pointer to incomplete type
这可能都是因为我在c之前学过java,大错特错!!!再次感谢您的帮助。
编辑:谢谢大家。所以我现在看到的方式是头 .h 文件中的所有内容都类似于 java 中的 public。我的分数结构定义对 c 编译器不是“公开的”,因此我的 matrix.c 无法访问它。
【问题讨论】:
-
使用 C 时必须适应的一件事:
public和private之类的词并不完全适用,而static一词的含义与它在 Java 中的含义不同.当您在 C 语言中获得更高级以创建类似于私有成员的structs时,“有一些方法”。但是关于static:在C 中,在文件范围级别,这意味着“私有”——声明一个变量,无论您在头文件中放入什么,都无法从另一个.c 文件访问该变量。static在文件范围和函数范围有不同的效果。 -
您是否分配了
sizeof(fraction)的任何内存并将其分配给某个元素matrix->m[i][j] = calloc(1, sizeof(fraction))某处?您不能仅仅将指针(您称之为fractionRef)分配给struct,您必须在某些时候分配实际的struct fractions,就像您为矩阵所做的那样。您可能只是没有包含该代码,这很好。只是想知道,既然您将该行标记为导致一些错误,我想知道。另外,我希望free_fraction()必须具有struct fraction *类型的参数。 -
好的,我发现这里需要注意的地方比我最初想象的要多。在继续之前我必须问:您是否要创建 rows 个行指针,然后让每行包含 columns 个分数指针?或者您是否希望每一行包含 columns 个实际分数结构?如果是第一种情况,您必须单独分配每个结构分数。如果是第二个,您必须一次分配每一行分数。告诉我,然后我会编辑我的答案。
标签: c compiler-errors multidimensional-array