2016-09-25 7 views
1

Visual Studio 2015でコードを実行しようとしていますが、次のコードをでdouble x1[dim];にスチールします。同じコードがg ++でコンパイルされていますが、VSにはありません

double fitness(const double x[], const int &dim) { 
    double sum = 0.0; 
    double x1[dim]; 
    ... 
    return sum; 
} 

g++ 4.8でエラーなしで同じコードが実行されます。だから私はVisual Studio 2015の下で同じことをすることができます。

私の問題はコンパイラやコードの実装ですか?

+0

std :: vectorまたはstd :: valarrayを使用してください – user3528438

+0

私はstd :: vectorやstd :: arrayのようなコンテナを避けようとしています。 – TomazStoiljkovic

+1

次に、動的配列( 'new'と' delete')を使うことができますが、非常にコンパイルされた理由がない限り、std :: vectorを優先します。あなたのコードが動作しない理由は、可変長配列(別名VLA)がc99の機能であり、デフォルトで拡張機能としてGCCによってサポートされています(afaik GCCのデフォルトのC++方言オプションは-std = gnu ++ 98 all gcc拡張を有効にします)。 MSVCは伝統的にC99をサポートしていないため、この言語機能はMSVCで利用できない可能性があります。 – user3528438

答えて

3

double x1[dim];はVLA(可変長配列)である。標準のC++ではありません。

gccで動作するのは、gccにVLAを許可する拡張子があるからです。 VS2015はそうではありません。そのため、コンパイルされません(独自の拡張機能はありますが、それだけではありません)。

最善の選択肢がstd::vectorです:

std::vector<double> x1(dim); //array of size dim 

あなたがそれを使用することができない場合(それが推奨されていませんが)、あなたはまだ手動で動的配列を使用することができますで

double* x1 = new double[dim]; 
delete[] x1; //Don't forget to delete it when you are done 
//Alternatively, create a class which wraps the dynamic array, so you can use RAII 
+0

'delete [] x1;'。 – user3528438

+0

@ user3528438 Jup、それを逃した。ありがとう! – Rakete1111

+0

newを使用している場合は、それをunique_prrに割り当てる必要があります。あるいは、alloca – doron

1

過去、MSVCでVLAを使用したかったときに、VLAをサポートしていないコンパイラでVLA機能を必要としていたときはいつでも、回避策としてalloca()を使用しました。

+0

軽量でシンプルで静的なサイズ。 – user3528438

関連する問題