1. ホーム
  2. c++

[解決済み] Array[n] vs Array[10] - 配列を変数で初期化する場合と実数で初期化する場合

2022-10-17 16:29:43

質問

私のコードに次のような問題があります。

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

以下のようなエラーを返します。

error: variable-sized object 'tenorData' may not be initialized

一方 double tenorData[10] は動作します。

誰か理由を知っていますか?

どのように解決するのですか?

C++では、可変長配列は合法ではありません。G++ では、(C が許可しているため) 拡張機能としてこれを許可しているので、G++ では ( を使用せずに) -pedantic C++ の標準に従うことについて)、できるようになります。

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

もし、quot;可変長配列(C++では、適切な可変長配列は許可されていないので、quot;動的サイズ配列と呼ぶ方がよい)が必要なら、自分で動的にメモリを確保しなければならない。

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

あるいは、もっといいのは、標準的なコンテナを使うことです。

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

それでもちゃんとした配列が欲しい場合は 定数 ではなく 変数 ではなく、作成時に

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

同様に、C++11で関数からサイズを取得したい場合は constexpr :

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression