有关类型转换错误的帮助

Help with type conversion error

本文关键字:帮助 错误 类型转换      更新时间:2023-10-16

当我试图编译我的程序时,我得到以下错误:

main.cpp: In function ‘int main()’:
main.cpp:67: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) -      1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void initializeMap(int, int, int (*)[10])’
main.cpp:68: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) - 1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void paintMap(int, int, int (*)[10])’

我的代码如下:

#include <iostream>
using namespace std;
void initializeMap(int mapSizeX, int mapSizeY, int map[][10])
{
    // Map details:
    // 0 = # (wall)
    // 1 = space (free space)
    // 2 = x (player)
    for(int x = 0; x < mapSizeX; x++)
    {
        map[x][0] = 0;
    }
    for(int y = 0; y < (mapSizeY - 2); y++)
    {
        map[0][y] = 0;
        for(int x = 0; x < (mapSizeX - 2); x++)
        {
            map[x][y] = 1;
        }
        map[mapSizeX][y] = 0;
    }
    for(int x = 0; x < mapSizeX; x++)
    {
        map[x][mapSizeY - 1] = 0;
    }
}
void paintMap(int mapSizeX, int mapSizeY, int map[][10])
{
    for(int y = 0; y < mapSizeY; y++)
    {
        for(int x = 0; x < mapSizeX; x++)
        {   
            switch(map[x][y])
            {
                case 0:
                    cout << "#";
                    break;
                case 1:
                    cout << " ";
                    break;
                case 2:
                    cout << "x";
                    break;
            }
            cout << map[x][y];
        }
        cout << endl;
    }
}
int main()
{
    int mapSizeX = 10;
    int mapSizeY = 10;
    int map[mapSizeX][mapSizeY];
    initializeMap(mapSizeX, mapSizeY, map);
    paintMap(mapSizeX, mapSizeY, map);
    cout << endl << endl;
    return 0;
}

我花了一个小时试图解决这个问题,花了大约二十分钟寻找解决方案。你们中有谁能帮我吗?

C++不支持可变长度数组,这就是代码中的map。但是,有些编译器可能会将其作为非标准扩展来支持。然而,它肯定不会与期望使用"标准"数组的函数兼容。

如果您将mapSizeXmapSizeY设为常量,这应该会起作用。

声明mapSizeXmapSizeY const。根据C++语言规范,您当前的代码基本上没有形成良好的格式,该规范只允许常量作为数组大小说明符。

错误消息完全是误导性的,这是因为一些编译器支持将其作为扩展,而最新的C语言标准也包含了它。

我在这里测试过。

函数调用期望第二个维度始终为10。您的代码在变量(mapSizeY(中具有该维度,不能保证为10,即使您提前设置了一行。

mapSizeY更改为const int,以便编译器可以对其进行优化。

如果在main方法中使mapSize[X|Y]常量,这应该会起作用。或者,当您将维度传递给每个方法时,为什么不将矩阵作为int**传递呢?

问题是可变长度的自动数组。解决此问题的一种方法是使main((中的项看起来与initializeMap((和paintMap((中相同。

int main()
{
    int mapSizeX = 10;
    // int mapSizeY = 10;
    int map[mapSizeX][10];
    initializeMap(mapSizeX, 10, map);
    paintMap(mapSizeX, 10, map);
    cout << endl << endl;
    return 0;
}

我不建议简单地声明MapSize为常量。然后看起来数组是可变长度的,而实际上不是。

您还应该注意,可变长度自动数组是C89和C++的GNU扩展。

在initializeMap an paintMap函数中将定义map[][10]更改为map[][]*map