为什么我会收到“无法分配大小为0的常量大小数组”错误?

7
我正在为学校编写扫雷程序,但我的代码出现了以下错误:

无法分配大小为0的常量数组

我不知道为什么会出现这种情况,因为我没有分配大小——我将其设置为0。另一个问题是,如何逐个读取我的输入字符,以便可以将其保存在数组中?
如下所示,我正在使用输入和输出。我注释了我的输入和输出,以便您们可以看到我用于此程序的内容。我想逐个读取字符以便可以将整个地图保存在数组中。
我正在使用MSVC++2010。
freopen("input.txt","rt",stdin);
//4 4
//*...
//....
//.*..
//....
//3 5
//**...
//.....
//.*...
//0 0


freopen("output.txt","wt",stdout);

/*Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100*/
int n=-1;
int m=-1;
int cont =0;
while(n!=0 && m!=0)
{
    scanf("%d %d",&n,&m);
    int VMatriz[n][m]={0};
    int Mapa[n][m]={0};


    if (n==0 && m==0)
        break;
    cont++;
    printf("Field #%d",cont);


    for (int i=0;i<n;i++)
    {   printf("/n");
        for (int j=0;j<m;j++)
        {

            scanf("%d ",&Mapa[i][j]);

            if (Mapa[i][j]=='*')
                {
                    if (j-1>=0)
                        VMatriz[i][j-1]++;
                    if (j+1<m)
                        VMatriz[i][j+1]++;
                    if (i-1>=0)
                        VMatriz[i-1][j]++;
                    if (i+1<m)
                        VMatriz[i+1][j]++;

                    if (j-1>=0 && i-1>0)
                        VMatriz[i-1][j-1]++;
                    if (j-1>=0 && i+1<m)
                        VMatriz[i+1][j-1]++;
                    if (j+1<m && i-1>0)
                        VMatriz[i-1][j+1]++;
                    if (j+1<m && i+1<m)
                        VMatriz[i+1][j+1]++;

                    VMatriz[i][j]='*';

                printf("%d",VMatriz[i][j]);


                }

        }   

    }
    printf("/n");


}
return 0;

}


重新标记为C,因为代码似乎是这样的。 - Mike Kwan
3
@MikeKwan:各位,不要将标签改为C,因为他正在使用C++编译器(Visual Studio没有明确地将其编译为C代码),问题并不是零大小数组,那只是你看到的第二个错误信息。 - Ed S.
Ed是正确的,当你在Visual Studio中尝试编译这样的代码时,你会首先看到常量表达式错误,然后是零大小错误。 - ShiggityShiggityShwa
1
不知道为什么有人会投票关闭这个问题,它是一个完全有效的问题(对于初学者来说理解起来可能有些困难)。 - Ed S.
抱歉,各位,但正如我在描述中告诉你们的那样,我的英语并不是很科学。我不是一个以英语为母语的人,所以我真的不知道用什么“词语”来解释我的问题。 顺便说一句,编辑器现在可以使用了,但是我在读取输入时遇到了问题。 - Giuseppe
1
@Giuseppe:请随意选择一个答案来解决这个线程,并发布一个新的线程,涉及您当前的问题(假设您找不到已经涵盖它的现有线程)。 - Ed S.
1个回答

10
int VMatriz[n][m]={0};

这是非法的。 还有这个更简单的版本;

int n = 10;
int x[n]; // C2057

然而...

int x[10]; // ok!

在这里你真正关心的错误是这个,而不是“无法分配大小为0的常数数组”的错误。

错误 C2057:预期常量表达式

C++中无法使用自动存储期间分配未知大小的数组。如果要使用可变大小的数组,则需要动态分配它(或者更好地使用vector)。

请注意,gcc有一个扩展以允许此操作,但在VS中不支持(也不是标准C++语言)。该扩展曾提交给C++11标准,但最终被拒绝了。


哦,现在我明白了,好的,我会尝试动态创建它。看看会发生什么,因为我也想看看输入问题。谢谢你的时间。 - Giuseppe
1
这在较新版本的C语言中是合法的。 - Mateen Ulhaq
1
@muntoo:没错,但他正在使用不支持C99的VS,即使这对我们来说看起来像C代码,我几乎可以保证他正在编译为C ++。因此,无论如何,这都是不合法的。 - Ed S.
请注意,您可以使用alloca绕过此限制。 - Zaffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接