2012-04-13 221 views
0

我有一個函數setPosition兩種聲明如下:將多維數組傳遞給函數?

void setPosition(char ***grid, int a, int b) { 
    int x = a/8; 
    int xbit = a % 8; 
    int y = b; 
    (*grid)[x][y] |= 1 << xbit; 
} 

,並在我的主,我有:

char grid[1000][1000]; 
setPosition(&grid, 10, 5); 

但我得到「警告:從兼容的指針類型過客‘setPosition兩種’的參數1」 。爲什麼?

+1

C或C++,這是什麼? 「正確的」答案會有所不同。他們不是一樣的語言,AARRRGH! :D – 2012-04-13 00:39:35

+0

C,我的不好,我在事故中標記了C++並忘記刪除它。 – MEURSAULT 2012-04-13 00:41:05

回答

4

數組和指針並不是相同的類型,即使數組傳遞給函數時衰減到指針。您可以更改方法簽名採取數組

void setPosition(char grid[][1000], Pos *p) 

,但如果你是做C++,vector<vector<char> >將提供一個更好的,更靈活的選擇。

2

除了當它是sizeof或一元&運營商的操作數,或是一個字符串被用來初始化一個聲明另一個數組,類型「的T N元件陣列」的表達將被轉換爲/用/「decay」替換爲類型爲「指向T」的表達式,其值爲數組中第一個元素的地址。

如果你打電話的功能

setPosition(grid, 10, 5); 

表達grid將有char [1000][1000]類型,它由規則上面將char (*)[1000]類型的表達式來代替,所以你的函數原型將需要

void setPosition(char (*grid)[1000], int a, int b) { ... } 

void setPosition(char grid[][1000], int a, int b) { ... } 

在這方面是相同的東西。

如果你打電話的功能

setPosition(&grid, 10, 5); 

則表達式&grid的類型爲char (*)[1000][1000],所以你的函數原型將需要

void setPosition(char (*grid)[1000][1000], int a, int b) { ... } 

,你需要明確取消引用grid申請前任何下標,如

(*grid)[a][b] = ...;