0

次のコードがVisualStudioではなくDev-C++コンパイラでコンパイルされるのはなぜですか?

何か案が?コードは次のとおりです。

#include<stdio.h>
main(){
    int n,i;
    scanf("%d",&n);
    int arr[n];
    for(i= 0 ; i <n ; i++)
    {
         //Do something with the array 
    }
    fflush(stdin);
    getchar();
}

エラーは次のとおりです。

エラーhttp://img688.imageshack.us/img688/6618/26863513.jpg

4

5 に答える 5

6

これ:

int arr[n];

nは定数式ではないため、は無効です。を使用してヒープに可変サイズの配列を割り当てる必要がありますmalloc(そして、使い終わったらそれらを解放しますfree)。

これを.cpp拡張子を付けてコンパイルしようとしている場合mainは、戻り値のタイプが。である必要がありintます。これを.c拡張機能でコンパイルしようとしている場合は、cスタイルのローカル変数宣言を使用し、関数の先頭ですべてのローカル変数を宣言する必要があります。

于 2009-11-19T20:41:08.423 に答える
4

Visual C ++は、その構文ではスタック割り当てを行いません(ただし、そうすることを望みます)。次のコマンドを使用して、スタック割り当てを明示的に行うことができます。

int *arr = (int *)_alloca(n*sizeof(*arr));

スコープが終了すると自動的に解放されるため、解放する必要はありません。

于 2009-11-19T20:58:30.623 に答える
3

これは有効なC++ではありませ。VisualC++コンパイラには最新のCコンパイラ(C ++のCサブセットではなく)が含まれておらず、特にC99などの新しいものは実装されていません。コードは、Visual C ++コンパイラが認識しない機能を使用しています(int arr[n])。

于 2009-11-19T20:50:17.410 に答える
1

あなたが得た答えを単純化するために:

コードはC99であり、VisualC++はC89のみをサポートします。自分に有利に働き、Windows用のより優れたコンパイラを入手してください。Intelコンパイラは、Microsoftコンパイラ(サポートされていない)よりもC99をはるかによくサポートしています。

于 2009-11-20T08:36:22.490 に答える
0

お使いのプログラムは標準に準拠したプログラムではありません。

標準に準拠したコンパイラは、コンパイルを試みるときに診断を発行する必要があります。

Dev-C ++が警告なしにコンパイルした場合、コンパイラは非準拠モードで呼び出されました。

必要な診断以外に、準拠したコンパイラーはとにかくコンパイルを試みるか、単にコンパイルを中止することができます。

main()

C89では、これは有効であり、診断は必要ありません。C99では、これは無効であり、診断が必要です(有効なC99定義はint main(void)、またはint main(int argc, char **argv)同等です)...したがって、準拠コンパイラを使用している場合は、C89コンパイラです。

scanf("%d",&n);
int arr[n];

おっと、これはC89では無効です。C89では、コードを宣言と混在させることはできません。C89コンパイラは、配列の宣言を確認したときに診断を発行する必要があります。

つまり...コンパイラを不適合な方法で使用しているのです。なぜコンパイルされるのか、コンパイルに失敗するのかを判断する方法はありません。

于 2009-11-19T20:56:25.527 に答える