我尽力搜索这方面的帮助,但鉴于此问题的关键字,我不断获得没有我特定问题的基本教程。
我获得了一个C库,使用定义的“Matrix”作为结构:
typedef struct
{
int height, width;
double **map;
} Matrix;
我正在编写一个需要输出矩阵的函数。我的代码目前看起来像:
Matrix convolve(Matrix data, Matrix filter) //this is line 28 btw
{
Matrix out;
<code>
return out
}
到目前为止,一切都在编译。然后我尝试在main()块中使用它:
int main()
{
double a1[4][5] = <a ton of numbers>
double f[3][3] = <a ton of other numbers>
Matrix m1 = createMatrixFromArray(&a1[0][0],4,5); //from given C library
Matrix mf = createMatrixFromArray(&f[0][0],3,3);
//This is the line that doesn't compile, which is line 14:
Matrix m2 = convolve(m1, mf);
}
然后VS 2017的开发人员命令提示符说:
(14) error C2440: 'initializing': cannot convert from 'int' to Matrix'
(28) error C2371: 'convolve': redefinition; different basic types
我做错了什么?提前感谢您的帮助。
答案 0 :(得分:3)
很难确定,因为您没有发布complete code,但这两个错误消息的组合强烈暗示编译器在声明之前看到了convolve
函数的使用。由于历史原因,当编译器看到它不知道的函数时,它假定此函数返回int
,而不是抱怨和中止编译。从您显示的代码中,第一次使用将是第14行。由于返回的int
已分配给Matrix
,编译器尝试转换该值,但int
之间没有转换和Matrix
。
稍后,在第28行,编译器看到了convolve
函数的定义,这次返回Matrix
,这与之前的(隐式)声明不兼容。
在您的情况下,解决方案是在使用之前定义函数。在C中,更常见的是在大多数编程语言中,您需要在使用之前定义(或至少声明)事物。 main
函数应始终是源文件中的最后一个函数,因为它使用其他函数,但没有其他函数使用它¹。
如果函数是在不同的源文件中定义的,则需要在头文件(.h
)中声明它,并将头文件包含在使用该函数的.c
文件中
任何中途体面的编译器至少会明确警告隐式声明:它们是允许的,但它们是个坏主意。 Visual Studio可以执行此操作,但我认为您需要从默认值中提高警告级别。
¹除了在递归调用main
的极不寻常的程序中。