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

时间:2017-06-19 10:59:50

标签: c arrays

我想将2D数组传递给函数。我写了3个函数:

  • 制作所有值== 0;
  • 使用所需的值实现它;
  • print matrix;

我的输出看起来不对。我在debug mod中检查了mapZero是否正常工作(它实现了所有行和列的零)。第一个矩阵必须只包含零值,第二个矩阵必须实现(顺便说一句,为什么我的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;
}

2 个答案:

答案 0 :(得分:1)

参数声明CreateCompatibleBitmap等于HDC hdcDesktop = ::CreateDC("DISPLAY", NULL, NULL, NULL); RECT desktopRect; ::GetWindowRect(::GetDesktopWindow(), &desktopRect); int desktopWidth = desktopRect.right - desktopRect.left; int desktopHeight = desktopRect.bottom - desktopRect.top; HBITMAP hBitmap = CreateCompatibleBitmap(hdcDesktop, desktopWidth, desktopHeight); /* HDC hdcMemory = CreateCompatibleDC(hdcDesktop); SelectObject(hdcMemory, hBitmap); BitBlt(hdcMemory, 0, 0, desktopWidth, desktopHeight, hdcDesktop, 0, 0, SRCCOPY); */ BITMAPINFO bitmapInfo = {0}; bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(hdcDesktop, hBitmap, 0, 0, NULL, &bitmapInfo, DIB_RGB_COLORS); BYTE *pData = new BYTE[bitmapInfo.bmiHeader.biSizeImage]; memset(pData, 0, bitmapInfo.bmiHeader.biSizeImage); GetDIBits(hdcDesktop, hBitmap, 0, bitmapInfo.bmiHeader.biHeight, pData, &bitmapInfo, DIB_RGB_COLORS); CRect destRect; GetClientRect(&destRect); StretchDIBits(::GetDC(m_hWnd), 0, 0, destRect.Width(), destRect.Height(), 0, 0, bitmapInfo.bmiHeader.biWidth, bitmapInfo.bmiHeader.biHeight, pData, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY); 。这是一个指针数组int * map[WIDTH][WIDTH]的数组。您传递了一个int * (*map)[WIDTH]数组数组。

删除星号,在参数中使用正确的类型,并使用正确的符号常量:int

您还可以使用两个不在声明函数中的额外参数调用short intshort int map[WIDTH][HEIGHT]

编译器应该抱怨所有

答案 1 :(得分:1)

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

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

如果编译的代码没有错误/警告,那么编译器就会出现问题。

通过数组参数调整的规则(&#34;衰减&#34;),上述数组声明作为参数列表的一部分,将由编译器调整为指向第一个元素的指针。 2D数组的第一个元素是1D数组,因此它被调整为指向1D数组int (*)[WIDTH]的数组指针。