C 将2D数组传递给函数:零值和打印问题

C 将2D数组传递给函数:零值和打印问题,c,arrays,C,Arrays,我想把2D数组传递给一个函数。我已经编写了3个函数: 使所有值==0 用期望值来实现它 打印矩阵 我的输出看起来不对。我在debug mod中检查了mapZero是否正常工作(它实现了所有行和列的零,但是没有)。第一个矩阵必须只包含零值,第二个矩阵必须实现(顺便说一句,为什么我在mapInit中的注释代码无法生成?似乎我做得对)。第三个矩阵是用我的算法实现的一个新矩阵(我写的是wave算法来寻找到达终点的最短路径) 我不知道我应该如何使用指针,在哪里使用指针(可能问题出在哪里?),以及如何以

我想把2D数组传递给一个函数。我已经编写了3个函数:

  • 使所有值==0
  • 用期望值来实现它
  • 打印矩阵
我的输出看起来不对。我在debug mod中检查了mapZero是否正常工作(它实现了所有行和列的零,但是没有)。第一个矩阵必须只包含零值,第二个矩阵必须实现(顺便说一句,为什么我在mapInit中的注释代码无法生成?似乎我做得对)。第三个矩阵是用我的算法实现的一个新矩阵(我写的是wave算法来寻找到达终点的最短路径)

我不知道我应该如何使用指针,在哪里使用指针(可能问题出在哪里?),以及如何以正确的方式通过宽度和高度

int-mapZero(int*map[WIDTH][WIDTH])
{
对于(int i=0;i
我的主要意见是:

#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;
}
#包括
#包括
#包括
#定义宽度8
#定义高度8
int-mapZero(int*map[WIDTH][WIDTH]);
int mapPrint(int map[宽度][高度]);
int-mapInit(int*map[WIDTH][WIDTH]);
int main(int argc,char*argv[])
{
短整型地图[宽度][高度];
短[宽度][高度];
mapZero(访问);
mapZero(map);
mapInit(地图、宽度、高度);
printf(“归零访问单元矩阵:\n\n”);
地图打印(已访问、宽度、高度);
printf(“映射的矩阵:\n\n”);
地图打印(地图、宽度、高度);
返回0;
}

参数声明
int*map[WIDTH][WIDTH]
等于
int*(*map)[WIDTH]
。这是指向
int
的指针数组。传递一个
短int
数组

删除星号,在参数中使用正确的类型和正确的符号常量:
short int-map[WIDTH][HEIGHT]

您还可以使用声明函数中没有的两个额外参数调用
mapInit
mapPrint


编译器应该对此进行投诉。

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

类似地,
short
数组不一定与
int
数组兼容。在任何地方都使用相同的类型

如果您的代码在编译时没有出现错误/警告,那么您的编译器就出了问题


根据数组参数调整规则(“decay”),当上述数组声明是参数列表的一部分时,编译器会将其调整为指向第一个元素的指针。2D数组的第一个元素是1D数组,因此它被调整为指向1D数组的数组指针,
int(*)[WIDTH]

忽略编译器警告的原因是什么?在询问调试问题之前,您需要启用建议的警告并修复它们。阅读。请不要破坏你的帖子。一旦您发布了一个问题,您就已经将内容授权给了Stack Overflow社区(在CC by SA许可下)。如果您想解除此帖子与您帐户的关联,请参阅。谢谢!我没有注意到我是如何在main()中声明数组的。现在它是正确的。但我仍然感兴趣的是,为什么不能按照mapInit()@GeorgeZ中注释中显示的方式实现我的数组。因为这在C语言中不是一个有效的语法。一般来说,您不能分配给数组,只需初始化它,分配给单个元素,或者复制到它。使用第二种方法,您可以在
mapInit
函数中创建所需的初始化数组,然后从该数组创建到
map
#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;
}