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. の戻り値の型をmainに変更しintます。
  4. return 0;最後の行として追加します。

void main()、さまざまな書籍、マニュアル、および Web チュートリアルに記載されていますが、正しい 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は、その最初の要素へのポインターに変換されます。

すべての配列も最初の要素へのポインターとして渡されるため、パラメーターvoid my_func(matrixType matrix)の型は と同じです。rowType*したがって、このコードのすべての型は、C 標準で明確に定義されている方法で一致する必要があります。 &my_matrix間違いではないかもしれませんが、型チェックのバグが発生する可能性が高い「エッジ ケース」です。

于 2012-07-20T01:52:32.283 に答える