3

重複の可能性:
C ++の可変長配列?

ユーザーが入力した別の変数によってサイズが制御される配列を作成しようとしています。私はC++コーディングの初心者で、VisualStudio2008プロフェッショナルコンパイラを使用しています。これは、コンパイラがエラーを表示するコードです。

double kplus2(double a, double ks, double kr)
{
    int n = (ks-1)*100000;
    double x[n];

エラーは

エラー2エラーC2057:予期される定数式
エラー3エラーC2466:定数サイズ0の配列を割り当てることができません
エラー4エラーC2133:'x':不明なサイズ

4

3 に答える 3

14

ユーザーが入力した別の変数によってサイズが制御される配列を形成しようとしています。

C++ にはすでにこの機能があります。呼び出さstd::vectorれ、ヘッダーに存在し<vector>ます。

double kplus2(double a, double ks, double kr)
{
    int n = (ks-1)*100000;
    std::vector<double> x(n);
于 2013-01-02T16:22:17.020 に答える
2

次のように、メモリを動的に割り当てる必要があります。

double *p = new double[n];

C++ のポインター構文は便利なので、配列と同じように使用できます。

p[0] = 3.14;
p[n-1] = 1.14;

使い終わったら、delete演算子を使用してメモリを破棄する必要があります。

delete [] p;

delete演算子のベクトル バージョンを使用したので、演算子のベクトル [] バージョンを使用することに注意してくださいnew

一部のコンパイラには、コーディングしようとしたように動的にサイズ変更されたローカル配列を許可する拡張機能があることに注意してください。gcc はそのようなコンパイラの 1 つです。それはまだ言語標準の一部ではありませんが、いつの日かそうなるかもしれません。

于 2013-01-02T16:16:40.023 に答える
1

ベクターを使用できます。実行時にサイズを変更することもできるため、データを追加したい場合は、必要なサイズの新しい配列を作成して現在のデータをコピーすることを心配する必要はありません。

ベクトルを使用できます。これはリスクが低いため、問題を解決するためのより良いアプローチです。

double kplus2(double a, double ks, double kr)
{
  int n = (ks-1)*100000;

  vector<double> x(n);  // you don't have to worry about deallocating it cuz its a container. It can grow in size at run time

  ...

 return 0;

}

ただし、これを行うこともできます。

double kplus2(double a, double ks, double kr)
{
  int n = (ks-1)*100000;

  double *x=new double[n]; // array of size i

  // you should also deallocate this dynamically allocated array at the end


  .....

  delete []x;

  return 0;

}

于 2013-01-02T16:53:14.883 に答える