将二维数组传递给函数:零值和打印问题
我想将二维数组传递给函数。我写了3个函数:将二维数组传递给函数:零值和打印问题
- 使所有值== 0;
- 以期望值实现它;
- print matrix;
我的输出看起来是错误的。我检查了mapZero工作正常的调试mod(它实现了所有行和列的零,但是)。第一个矩阵必须只包含零值,第二个矩阵实现(顺便说一下,为什么我在mapInit中的注释代码无法建立?看起来我做得对)。第三个矩阵是用我的算法实现的一个新矩阵(我正在用波浪算法来找到到最后点的最短路径)。
我不能得到如何以及在何处,我应该使用指针(也许问题是吗?),以及如何通过WIDTH和HEIGHT用正确的方式。
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;
}
的参数声明int * map[WIDTH][WIDTH]
等于int * (*map)[WIDTH]
。这是一组指针至int
。你传递一个数组short int
。
下降了星号,在参数使用正确的类型和正确的符号常量:short int map[WIDTH][HEIGHT]
。
您还可以拨打mapInit
和mapPrint
,并带有两个额外的参数,这些参数不在声明的函数中。
编译器应该抱怨这一切。
谢谢!我没有注意到我是如何在main()中声明数组的。现在它是正确的。 但我仍然感兴趣为什么我不能用它在mapInit() –
@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]
。
任何你忽略编译器警告的原因?在询问调试问题之前,您需要启用建议的警告并解决它们。并阅读[问]。 – Olaf
请不要破坏你的帖子。一旦你发布了一个问题,你已经将内容授权给了Stack Overflow社区(在CC-by-SA许可下)。如果您想要从您的帐户中取消关联此信息,请参阅[关于解除关联请求的正确途径?](http://meta.stackoverflow。COM /问题/ 323395 /什么,是最合适的路线换一个解离请求)。 – Bugs