7

私が最後に配列にアクセスしてからしばらく経ちました(最近ベクトルを使用しています)。使用しているライブラリdouble arrayがこの配列のアクセサーが使用するタイプのパラメーターを受け入れるため、2Dベクトルを2D配列に変換し直す必要があります。foo[i][j]たとえばです。

これが私のコードです:

double** setupHMM(vector<vector<double> > &vals, int N, int M)
{
  double** temp;
  temp = new double[N][M];

 for(unsigned i=0; (i < N); i++)
 {
    for(unsigned j=0; (j < M); j++)
    {
        temp[i][j] = vals[i][j];
    }
 }
}

そしてこれで、私は得ますerror: ‘M’ cannot appear in a constant-expression

私も次のことを試しました:

double** setupHMM(vector<vector<double> > &vals, int N, int M)
{
   double** temp;

   for(unsigned i=0; (i < N); i++)
   { 
      temp[i] = new double[N];
      for(unsigned j=0; (j < M); j++)
      {
          temp[j] = new double[M];
          temp[i][j] = vals[i][j];
      } 
   }
 }

ただし、これによりセグメンテーション違反11が発生します。

誰かがアドバイス、またはベクトルを2D配列に変換するためのより良い方法を提案できますか?

ありがとう

4

3 に答える 3

12

あなたは近かった。そのはず:

double** setupHMM(vector<vector<double> > &vals, int N, int M)
{
   double** temp;
   temp = new double*[N];
   for(unsigned i=0; (i < N); i++)
   { 
      temp[i] = new double[M];
      for(unsigned j=0; (j < M); j++)
      {
          temp[i][j] = vals[i][j];
      } 
   }
 }
于 2013-03-08T14:04:00.357 に答える
9

二重ポインタ ( double**) は 2D 配列に変換できません。

double** temp;
temp = new double[N][M];  //invalid


double** temp;
temp = new double(*)[M];

1D 配列がポインターに減衰するため、2D 配列が double ポインターに減衰すると考えるのはよくある誤解です。本当じゃない。減衰は、単一のポインターでのみ発生します。

于 2013-03-08T14:04:50.787 に答える
1

交換

temp[i] = new double[N];

temp = new double*[N];

2番目のコードで、ループの外に移動します

于 2013-03-08T14:04:40.637 に答える