2011-11-16 92 views
2

下面的代碼編譯細Linux上使用gcc -std = C99,但得到的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]; 

微軟的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標準呢?根據維基百科,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;  
     } 
    } 
} 
相關問題