如何正确定义和使用返回类型为用户定义结构的函数? (在C中)

时间:2018-03-20 06:37:46

标签: c matrix struct

我尽力搜索这方面的帮助,但鉴于此问题的关键字,我不断获得没有我特定问题的基本教程。

我获得了一个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

我做错了什么?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

很难确定,因为您没有发布complete code,但这两个错误消息的组合强烈暗示编译器在声明之前看到了convolve函数的使用。由于历史原因,当编译器看到它不知道的函数时,它假定此函数返回int,而不是抱怨和中止编译。从您显示的代码中,第一次使用将是第14行。由于返回的int已分配给Matrix,编译器尝试转换该值,但int之间没有转换和Matrix

稍后,在第28行,编译器看到了convolve函数的定义,这次返回Matrix,这与之前的(隐式)声明不兼容。

在您的情况下,解决方案是在使用之前定义函数。在C中,更常见的是在大多数编程语言中,您需要在使用之前定义(或至少声明)事物。 main函数应始终是源文件中的最后一个函数,因为它使用其他函数,但没有其他函数使用它¹。

如果函数是在不同的源文件中定义的,则需要在头文件(.h)中声明它,并将头文件包含在使用该函数的.c文件中

任何中途体面的编译器至少会明确警告隐式声明:它们是允许的,但它们是个坏主意。 Visual Studio可以执行此操作,但我认为您需要从默认值中提高警告级别。

¹除了在递归调用main的极不寻常的程序中。