2017-06-19 27 views
-1

我想將二維數組傳遞給函數。我寫了3個函數:將二維數組傳遞給函數:零值和打印問題

  • 使所有值== 0;
  • 以期望值實現它;
  • print matrix;

我的輸出看起來是錯誤的。我檢查了mapZero工作正常的調試mod(它實現了所有行和列的零,但是)。第一個矩陣必須只包含零值,第二個矩陣實現(順便說一下,爲什麼我在mapInit中的註釋代碼無法建立?看起來我做得對)。第三個矩陣是用我的算法實現的一個新矩陣(我正在用波浪算法來找到到最後點的最短路徑)。

我不能得到如何以及在何處,我應該使用指針(也許問題是嗎?),以及如何通過WIDTH和HEIGHT用正確的方式。

enter image description here

int mapZero(int * map[WIDTH][WIDTH]) 
{ 
    for (int i = 0; i < WIDTH; ++i) 
    { 
     for (int j = 0; j < HEIGHT; ++j) 
     { 
      map[i][j] = 0; 
     } 
    } 
} 

int mapPrint(int map[WIDTH][HEIGHT]) 
{ 
    for (int i = 0; i < WIDTH; ++i) 
    { 
     for (int j = 0; j < HEIGHT; ++j) 
     { 
      printf("%2d ", map[i][j]); 
     } 
     printf("\n\n"); 
    } 
    printf("\n"); 
    return 0; 
} 

int mapInit(int * map[WIDTH][WIDTH]) 
{ 
    /* 
    map[WIDTH][WIDTH] = 
    { 
     { 127,1,1,1,1,1,1, 1 }, 
     { 0, 1,0,0,0,1,1, 1 }, 
     { 1, 1,1,1,0,0,0, 1 }, 
     { 1, 0,0,1,0,0,0, 1 }, 
     { 1, 0,1,1,0,0,1, 1 }, 
     { 1, 1,1,1,1,1,1, 1 }, 
     { 0, 1,0,0,1,0,1, 1 }, 
     { 1, 1,1,1,1,1,1,255 }, 
    }; 
    */ 

    for (int i = 0; i < WIDTH; ++i) 
    { 
     for (int j = 0; j < HEIGHT; ++j) 
     { 
      map[i][j] = 0; 
     } 
    } 

    for (int j = 0; j < WIDTH; ++j) 
    { 
     map[0][j] = 1; 
     map[7][j] = 1; 
     map[j][7] = 1; 
     map[5][j] = 1; 
    } 

    for (int j = 2; j < 5; ++j) 
    { 
     map[j][0] = 1; 
    } 

    map[1][1] = 1; map[1][5] = 1; map[1][6] = 1; 
    map[2][1] = 1; map[2][2] = 1; map[2][3] = 1; 
    map[3][3] = 1; 
    map[4][2] = 1; map[4][3] = 1; map[4][6] = 1; 
    map[6][1] = 1; map[6][4] = 1; map[6][6] = 1; map[6][7] = 1; 
    map[0][0] = 22; 
    map[7][7] = 99; 

    return 0; 
} 

我的main.c:

#include <stdbool.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define WIDTH 8 
#define HEIGHT 8 

int mapZero(int * map[WIDTH][WIDTH]); 
int mapPrint(int map[WIDTH][HEIGHT]); 
int mapInit(int * map[WIDTH][WIDTH]); 

int main(int argc, char * argv[]) 
{ 
    short int map[WIDTH][HEIGHT]; 
    short int visited[WIDTH][HEIGHT]; 

    mapZero(visited); 
    mapZero(map); 
    mapInit(map, WIDTH, HEIGHT); 

    printf("Matrix of zeroed-visited cells:\n\n"); 
    mapPrint(visited, WIDTH, HEIGHT); 
    printf("Matrix of the map:\n\n"); 
    mapPrint(map, WIDTH, HEIGHT); 

    return 0; 
} 
+0

任何你忽略編譯器警告的原因?在詢問調試問題之前,您需要啓用建議的警告並解決它們。並閱讀[問]。 – Olaf

+0

請不要破壞你的帖子。一旦你發佈了一個問題,你已經將內容授權給了Stack Overflow社區(在CC-by-SA許可下)。如果您想要從您的帳戶中取消關聯此信息,請參閱[關於解除關聯請求的正確途徑?](http://meta.stackoverflow。COM /問題/ 323395 /什麼,是最合適的路線換一個解離請求)。 – Bugs

回答

1

的參數聲明int * map[WIDTH][WIDTH]等於int * (*map)[WIDTH]。這是一組指針int。你傳遞一個數組short int

下降了星號,在參數使用正確的類型和正確的符號常量:short int map[WIDTH][HEIGHT]

您還可以撥打mapInitmapPrint,並帶有兩個額外的參數,這些參數不在聲明的函數中。

編譯器應該抱怨這一切

+0

謝謝!我沒有注意到我是如何在main()中聲明數組的。現在它是正確的。 但我仍然感興趣爲什麼我不能用它在mapInit() –

+1

@GeorgeZ中的註釋中顯示的方式實現我的數組。因爲這在C中不是一個有效的語法。通常你不能*給數組賦值,只是初始化它,賦值給單個元素或者拷貝到它。第二種方法是,你可以在'mapInit'函數中創建一個初始化數組,然後['memcpy'](http://en.cppreference.com/w/c/string/byte/memcpy)那'映射'。 –

1

int * map[WIDTH][WIDTH]是一個指針數組。它與調用程序中的數組不兼容,因此代碼不應編譯。將其更改爲int map[WIDTH][WIDTH]

類似地,short的陣列不一定與int的陣列兼容。到處使用相同的類型。

如果你的代碼沒有錯誤/警告編譯有一些非常嚴重的問題你的編譯器。

通過數組參數調整(「decay」)的規則,上面的數組聲明,當參數列表的一部分,將被編譯器調整爲指向第一個元素的指針。二維數組的第一個元素是一維數組,因此它被調整爲數組指針,指向一維數組int (*)[WIDTH]