Почему компилятору Visual Studio C не нравится это? - PullRequest
2 голосов
/ 16 ноября 2011

Следующий код прекрасно компилируется в Linux с использованием gcc -std = c99, но получает следующие ошибки в компиляторе 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

Пользователь вводит количество чисел Фибоначчи, которое нужно сгенерировать.Мне любопытно, почему компилятору Microsoft не нравится этот код.

#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]);
    }
}

Ответы [ 3 ]

7 голосов
/ 16 ноября 2011
void fib(int max)
{
    int num[max];

Компилятор Microsoft C не поддерживает C99, и я думаю, они сказали, что никогда не будет.Это означает, что массивы могут быть объявлены только с постоянным размером.

4 голосов
/ 16 ноября 2011

Проблема заключается в функции 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;    
        }
    }
}
3 голосов
/ 16 ноября 2011

Вы можете изменить свою функцию для динамического выделения массива, а затем освободить память, когда закончите. Остальная часть вашей функции будет работать без изменений.

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

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