繁体   English   中英

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

[英]How do I properly define and use a function whose return type is a user defined structure? (In C)

我尽力寻找有关此问题的帮助,但是给了这个问题的关键词,我不断得到没有特定问题的基础教程。

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

我究竟做错了什么? 预先感谢您的帮助。

很难确定,因为您没有发布完整的代码 ,但是这两个错误消息的结合强烈表明编译器在声明convolve函数之前就已经看到了它的用法。 由于历史原因,当编译器看到它不知道的函数时,它会假定该函数返回int ,而不是抱怨并中止编译。 在您显示的代码中,第一个用法是第14行。由于返回的int被分配给Matrix ,因此编译器尝试转换该值,但是intMatrix之间没有任何转换。

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

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

如果功能是在其他源文件中定义的,则需要在头文件( .h )中声明它,并将头文件包含在使用该功能的.c文件中。

任何中途的编译器都至少会明确警告隐式声明:允许使用隐式声明,但这是一个坏主意。 Visual Studio可以做到这一点,但我认为您需要将警告级别从默认级别提高。

¹ 除非非常不寻常的程序会以递归方式调用main

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM