2013-03-12 18 views
0

ggc給我這個錯誤,我不能相信錯誤是正確的,因爲輸入和期望的參數都是[8] [8]指向數組的指針,任何想法是什麼錯誤這裏!指向數組,GCC

main.c: In function ‘main’:main.c:24:3: warning: passing argument 1 of ‘DRESC_Transform’ from incompatible pointer type [enabled by default] 
In file included from main.c:1:0: 
global.h:13:6: note: expected ‘short int * (*)[8]’ but argument is of type ‘short int (*)[8][8]’ 

這是global.h

#include <math.h> 
#include <stdio.h> 

# define ROW 8 
# define COL 8 
# define SHIFT_AMOUNT 16 
# define SHIFT_MASKT (1<<SHIFT_AMOUNT)-1 


void DRESC_Transform(short *matrix [ROW][COL]); 


void DRESC_Transform(short *matrix [ROW][COL]){ 


    int _tmp_matrix [ROW*COL]; // 2KB REGISTER 

    for (unsigned i = 0; i <ROW; i++){ 

    int _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5, _tmp6, _tmp7; 

    _tmp0 = *matrix [i][0]; 
    _tmp1 = *matrix [i][1]; 
    _tmp2 = *matrix [i][2]; 
    _tmp3 = *matrix [i][3]; 
    _tmp4 = *matrix [i][4]; 
    _tmp5 = *matrix [i][5]; 
    _tmp6 = *matrix [i][6]; 
    _tmp7 = *matrix [i][7]; 

    _tmp_matrix [ (i<<3)] = _tmp0 <<SHIFT_AMOUNT; 
    _tmp_matrix [1 + (i<<3)] = _tmp1 <<SHIFT_AMOUNT; 
    _tmp_matrix [2 + (i<<3)] = _tmp2 <<SHIFT_AMOUNT; 
    _tmp_matrix [3 + (i<<3)] = _tmp3 <<SHIFT_AMOUNT; 
    _tmp_matrix [4 + (i<<3)] = _tmp4 <<SHIFT_AMOUNT; 
    _tmp_matrix [5 + (i<<3)] = _tmp5 <<SHIFT_AMOUNT; 
    _tmp_matrix [6 + (i<<3)] = _tmp6 <<SHIFT_AMOUNT; 
    _tmp_matrix [7 + (i<<3)] = _tmp7 <<SHIFT_AMOUNT; 

    } 

    for (unsigned i = 0; i < ROW; i++){ // a row calculation 

    int _tmp; 

    _tmp_matrix[ (i<<3)] = (_tmp_matrix[ (i<<3)] + _tmp_matrix[1 + (i<<3)]) >>1; 
    _tmp     = (_tmp_matrix[ (i<<3)] - _tmp_matrix[1 + (i<<3)]); 
    _tmp_matrix[1 + (i<<3)] = (_tmp_matrix[2 + (i<<3)] + _tmp_matrix[3 + (i<<3)]) >>1; 
    _tmp_matrix[2 + (i<<3)] = (_tmp_matrix[4 + (i<<3)] + _tmp_matrix[5 + (i<<3)]) >>1; 
    _tmp_matrix[4 + (i<<3)] = _tmp; 
    _tmp     = (_tmp_matrix[6 + (i<<3)] + _tmp_matrix[7 + (i<<3)]) >>1; 
    _tmp_matrix[6 + (i<<3)] = (_tmp_matrix[2 + (i<<3)] - _tmp_matrix[5 + (i<<3)]); 
    _tmp_matrix[5 + (i<<3)] = (_tmp_matrix[1 + (i<<3)] - _tmp_matrix[3 + (i<<3)]); 
    _tmp_matrix[3 + (i<<3)] = _tmp; 
    _tmp_matrix[7 + (i<<3)] = (_tmp_matrix[3 + (i<<3)] - _tmp_matrix[7 + (i<<3)]); 
    } 


    for (unsigned i = 0; i <ROW; i++){ 

    int _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5, _tmp6, _tmp7; 

    _tmp0 = _tmp_matrix [ (i<<3)] >>SHIFT_AMOUNT; 
    _tmp1 = _tmp_matrix [1 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp2 = _tmp_matrix [2 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp3 = _tmp_matrix [3 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp4 = _tmp_matrix [4 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp5 = _tmp_matrix [5 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp6 = _tmp_matrix [6 + (i<<3)] >>SHIFT_AMOUNT; 
    _tmp7 = _tmp_matrix [7 + (i<<3)] >>SHIFT_AMOUNT; 

    *matrix [i][0] = _tmp0; 
    *matrix [i][1] = _tmp1; 
    *matrix [i][2] = _tmp2; 
    *matrix [i][3] = _tmp3; 
    *matrix [i][4] = _tmp4; 
    *matrix [i][5] = _tmp5; 
    *matrix [i][6] = _tmp6; 
    *matrix [i][7] = _tmp7; 


    } 

} 

,這是主要的:

#include "global.h" 

void main(){ 

    short matrix [ROW][COL] = {{7, 1, 6, 6, 3, -5, 4, 2}, // <<<<--- 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}, 
       {7, 1, 6, 6, 3, -5, 4, 2}}; 

    DRESC_Transform(&matrix); // <<<--- 

    printf("the transformed matrix is \n"); 
    printf("{"); 
    for (unsigned i; i <ROW; i++){ 
    for (unsigned j = 0; j <COL; j++){ 
     printf("%d,", matrix[i][j]); 
    } 
    printf("\b}, \n"); 
    } 
    printf("\b} \n"); 

} 
+1

如果你不知道,'1 + i << 3'是'(1 + i)<< 3',而不是'1 +(i << 3)'。 – 2013-03-12 03:12:07

+0

哇,謝謝,我沒有注意到替換所有功能,刪除了! – inman 2013-03-12 03:17:26

+0

而且僅供參考,問題是該函數需要'short *'的二維數組,但是您會將其傳遞給'short'的二維數組。 – 2013-03-12 03:23:53

回答

0

一般情況下,對於任何尺寸的數組:

T array[S1][S2][...][SN] 

當你將它傳遞給函數,衰減到

T array[][S2][...][SN] 

這只不過是一個不同的語法更多

T (*array)[S2][...][SN] 

因此,如果你想通過數組short matrix[ROW][COL]一個函數,該函數應該接受short matrix[][COL]

正如您通過語法T (*array)[S2][...][SN]所看到的,數組作爲指針傳遞。所以不要害怕;如果修改函數內數組的元素,則該函數返回時,結果將顯示在原始數組中。

只有當您修改指針matrix(該函數中的局部變量),並將其直接指定爲指向新陣列(如matrix = ...)時,您才能看到任務的唯一時間。


至於其他注意事項,void main不是main一個有效的聲明。它應該是int main,如果你使用C,你最後應該有return 0

+0

嗨,謝謝你的迴應....我的想法是一樣的,我想我給該函數的數組地址,以便它可以改變內存中的數組值!但說實話,我不明白你是什麼意思與陣列[S1] [S2] [...] [SN]衰變陣列[] [S2] [...] [SN],這些是與(* array)[S2] [SN]相同,因爲我們將它傳遞給一個函數! – inman 2013-03-12 04:27:18

+0

@inman您只能更改數組中的值。如果你像我展示的那樣做,它會做到這一點。當我說T array [S1] [S2]的意思是,例如,如果你聲明一個變量int array [1] [2] [3]並且你想把它傳遞給一個函數,你應該寫函數來取int數組[] [2] [3]或int(* array)[2] [3]。在這兩者之間,你可以選擇更喜歡哪一個,因爲它們是相同的。 – 2013-03-12 04:39:40