繁体   English   中英

为什么Visual Studio C编译器不是这样的?

[英]Why doesn't the Visual Studio C compiler like this?

以下代码使用gcc -std = c99在Linux上编译正常但在Visual Studio 2010 C编译器上获得以下错误:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

fib.c
fib.c(42) : error C2057: expected constant expression
fib.c(42) : error C2466: cannot allocate an array of constant size 0
fib.c(42) : error C2133: 'num' : unknown size

用户输入要生成的斐波那契数量。 我很好奇微软编译器为什么不喜欢这段代码。

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

void fib(int max);

int main(int argc, char *argv[])
{    
    int argument;

    if (argc != 2)
    {
        puts("You must supply exactly one command line argument.");
        return 0;
    }

    argument = atoi(argv[1]);

    if (argument == 0)
    {
        puts("You gave us 0 or an invalid integer.");
        return 0;
    }
    else if (argument < 0)
    {
        puts("You gave us a negative integer.");
        return 0;
    }
    else if (argument == INT_MAX)
    {
        puts("You gave us a number that's too big to fit in an integer.");
        return 0;
    }

    printf("%d\n", argument);
    fib(argument);
    return 0;
}

void fib(int max)
{
    int num[max]; /// <- Line 42

    int i;
    for (i = 0; i < max; i++)
    {    
        if (i == 0)
            num[i] = 0;
        else if (i == 1)
            num[i] = 1;
        else
            num[i] = num[i-1] + num[i-2];

        printf("%d\t%d\n", i, num[i]);
    }
}
void fib(int max)
{
    int num[max];

微软的C编译器不支持C99,我相信他们已经说过它永远都不会。 这意味着只能使用常量大小声明数组。

问题在于fib功能。

行“int num [max];” 是问题。 这是因为,编译器尝试分配最大整数数的空间,但是在编译时没有为编译器正确定义标记max。

您可以使用动态内存分配来解决此问题。

但我想知道为什么你可能需要这么大的空间(当最大的时候)因为你只需要以前的数字来生成序列。

void fib(int max)
{

    int a = 0, b = 1; // first 2 numbers of the sequence.
    int c, i;
    for (i = 0; i < max; i++)
    {    
        if (i == 0)
            printf ("%d %d",i,a);
        else if (i == 1)
            printf ("%d %d",i,b); 
        else{
            c = a+b;
            printf ("%d %d",i,c);
            a = b;
            b = c;    
        }
    }
}

您可以更改函数以动态分配数组,然后在完成后释放内存。 您的其余功能将无需更改即可运行。

void fib(int max)
{
    int *num = malloc(max * sizeof(int));

    int i;
    for (i = 0; i < max; i++)
    {
        /* Your code here */
    }
    free(num);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM