2011-11-16 3 views
2

다음 코드는 gcc가 -std = C99을 사용하여 리눅스에서 잘 컴파일하지만, 비주얼 스튜디오 2010 C 컴파일러에서 다음 오류를 가져옵니다Visual Studio 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]); 
    } 
} 
+1

는 http://stackoverflow.com/questions/146381/visual-studio-support-for-new-c-c-standards –

답변

7
void fib(int max) 
{ 
    int num[max]; 

마이크로 소프트의 C 컴파일러는 C99를 지원하지 않습니다, 나는 그들이 그것을 결코 말한 생각합니다. 즉, 배열은 일정한 크기로만 선언 할 수 있습니다.

+0

가 어떻게이 문제를 해결 얻을 수있는 코드를 변경할 것이라고 보는가? – justin

+1

@Justin malloc 또는 alloca – IronMensan

+0

alloca를 사용하면 얻을 수있는만큼 VLA에 가까워집니다. – moshbear

3

배열을 동적으로 할당하고 완료되면 함수를 변경하여 메모리를 해제 할 수 있습니다. 나머지 기능은 변경없이 작동합니다.

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

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

감사합니다. 어떤 사람들은 아직 C99 표준으로 전환하지 않은 이유가 있습니까? Wikipedia에 따르면 C99는 약 10 년 동안 나간 적이 있습니까? – justin

+0

@Justin - C++에서 일부 비 호환성 문제가 발생합니다. MSFT는 자신들의 C++ 컴파일러가 주요 시장이라고 주장합니다. http://stackoverflow.com/questions/146381/visual-studio-support-for-new-c-c-standards를 참조하십시오. –

4

문제는 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;  
     } 
    } 
}