2011-11-16 15 views
2

次のコードは、gccの-std = c99をを使用して、Linux上で罰金コンパイルが、Visual Studioの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]; 

Microsoftの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;  
     } 
    } 
} 
関連する問題