帮助解决类型转换错误

时间:2011-07-03 22:03:54

标签: c++

当我尝试编译程序时,出现以下错误:

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;
}

我花了一个小时试图解决问题,大约二十分钟寻找解决方案。你们中的任何人可以帮助我吗?

6 个答案:

答案 0 :(得分:5)

C ++不支持可变长度数组,这是代码中的map。但是,某些编译器可能会支持它作为非标准扩展。但是,它肯定不会与期望“标准”阵列的功能兼容。

如果你制作mapSizeXmapSizeY常量,这应该可行。

答案 1 :(得分:2)

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

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

我测试了它here

答案 2 :(得分:1)

如果你在main方法中使用mapSize[X|Y] const,这应该可行。或者,当您将尺寸传递给每个方法时,为什么不将矩阵作为int**传递?

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

问题是可变长度自动数组。解决这个问题的一种方法是使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?声明为const。然后,当它确实不是时,它看起来像是可变长度的。

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

答案 5 :(得分:-1)

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