1

我正在尝试在 Workbench 中编译以下简单代码:

 1. typedef float matrixType[3][3]
 2.     
 3. void my_func(matrixType matrix)
 4. {
 5.     printf("matrix[0][0] = %g\n",matrix[0][0]);
 6. }
 7. 
 8. void main()
 9. {
10.     matrixType my_matrix = {{0,1,2},{3,4,5},{6,7,8}};
11.     matrixType* ptr_matrix = &my_matrix;
12. 
13.     my_func(*ptr_matrix);
14. }

我收到以下警告:

test.c:13: warning: passing arg 1 of `my_func' from incompatible pointer type

我不明白,我做错了什么。在 Visual Studio 中编译相同代码时没有任何警告,但在 Workbench 中出现问题。

谢谢。

4

2 回答 2

1

您在第 1 行的末尾缺少一个分号。

于 2012-07-19T16:47:32.847 回答
1

gcc (GCC) 4.5.3打开所有警告后,在进行以下更改后也可以正常编译:

  1. 在第一行之后添加分号。
  2. #include <stdio.h>在顶部添加。
  3. 将返回类型更改mainint
  4. 添加return 0;为最后一行。

void main()即使它出现在各种书籍、手册和网络教程中,它也是不正确的C。在某些架构上,它会导致奇怪的问题,通常是在程序终止时。

获取数组类型的地址是对工作台类型检查器的挑战。我不会拖出 C 标准来确定工作台警告是否正确。这可能是一个错误。

但我很确定,如果您以这种方式重新编码,您将不会看到任何编译器出现错误:

#include <stdio.h>

typedef float rowType[3];
typedef rowType matrixType[3];

void my_func(matrixType matrix) 
{ 
   printf("matrix[0][0] = %g\n",matrix[0][0]); 
} 

int main() 
{ 
    matrixType my_matrix = {{0,1,2},{3,4,5},{6,7,8}}; 
    rowType* ptr_matrix = my_matrix; 
    my_func(ptr_matrix);
    return 0; 
} 

原因是它my_matrix会自动转换为指向它在赋值中的第一个元素的指针

rowType* ptr_matrix = my_matrix; 

这就像在

char s[] = "hello world!"; 
char *p = s;

数组名s被转换为指向其第一个元素的指针。

参数 invoid my_func(matrixType matrix)具有相同的类型,rowType*因为所有数组也作为指向第一个元素的指针传递。因此,此代码中的所有类型都必须以 C 标准中非常明确定义的方式匹配。 &my_matrix可能不正确,但它是一个“边缘情况”,更有可能暴露类型检查错误。

于 2012-07-20T01:52:32.283 回答