将二维数组传递给函数:零值和打印问题

问题描述:

我想将二维数组传递给函数。我写了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

的参数声明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)那'映射'。 –

int * map[WIDTH][WIDTH]是一个指针数组。它与调用程序中的数组不兼容,因此代码不应编译。将其更改为int map[WIDTH][WIDTH]

类似地,short的阵列不一定与int的阵列兼容。到处使用相同的类型。

如果你的代码没有错误/警告编译有一些非常严重的问题你的编译器。

通过数组参数调整(“decay”)的规则,上面的数组声明,当参数列表的一部分,将被编译器调整为指向第一个元素的指针。二维数组的第一个元素是一维数组,因此它被调整为数组指针,指向一维数组int (*)[WIDTH]