2012-07-19 26 views
1

我試圖編譯工作臺下面簡單的代碼:經過兩dimmensional陣列的功能

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中出現了問題。

謝謝。

+3

可能不是問題,但是你在第一行末尾丟失了分號。除此之外,代碼看起來對我來說確實很好。 – betabandido 2012-07-19 16:46:05

回答

1

結束分號隨着gcc (GCC) 4.5.3所有警告開啓它也編譯罰款做以下修改:

  1. 添加一個分號後第一行。
  2. 在頂部添加#include <stdio.h>
  3. main的退貨類型更改爲int
  4. 添加return 0;作爲最後一行。

void main()不正確C雖然它出現在各種書籍,手冊和Web教程中。在某些體系結構中,通常在程序終止時會引起奇怪的問題。

取一個數組類型的地址正在挑戰工作臺類型檢查器。我不會拖出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可能不是不正確的,但這是一個「邊緣情況」更可能暴露類型檢查錯誤。

+0

'void main()'和分號在這裏不是問題,但你的建議確實有幫助!非常感謝!我正在處理的另一個問題是,如果my_func是這樣定義的:void my_func(const matrixType matrix)',我再次收到這樣的警告。我覺得這很奇怪,因爲我認爲可以將一個非const參數傳遞給一個接收'const'的函數。 – kosteg 2012-07-22 06:18:42

+0

我提到過'void main',因爲編輯們因爲類似的傳球而責備我一次。沒有意圖變得迂腐。這真的是錯誤的,可以咬你。數組參數和賦值的'const'問題是舊的。請參閱http://stackoverflow.com/questions/4573349/c-function-const-multidimensional-array-argument-strange-warning。允許的'const'的唯一「自動升級」是形成一個指向非''constst'對象的'const'指針。參數傳遞和分配不包括在這裏。 'const'必須匹配,否則你必須使用一個強制轉換強制它。 – Gene 2012-07-22 18:58:57

+0

非常感謝!你的評論確實有幫助。 – kosteg 2012-07-23 05:56:28