0

doubleの配列を返す関数があります。私のデバッガーでは、配列を昆虫化し、その値が{6.5、1.5}であることを確認します。ただし、配列をcoutに出力すると、「6.5,3.30525e+230」と表示されます。私の推測では、<<が値を変更しているか、正しくフォーマットされていません

double *result;

result = haar1d(series, 2, seriesAverage);

->ここのブレークポイントで、result [0]==6.5およびresult[1]==1.5が表示されます

for(int i = 0; i < 2; i++)
{
    cout << result[i] << ",";
}

修正済み:これが私が最終的に得たものです。

vector<double> haar1d(vector<double> vec, double seriesAverage)
{
vector<double> transVec(vec.size(), 0);
vector<double>::size_type length = vec.size();

if(vec[0] == seriesAverage)
{
    return vec;
}

int diffFromAvgs = length / 2;

for(int i = 0; i < length; i += 2)
{
    double pairAverage = (vec[i] + vec[i + 1]) / 2;
    transVec[i] = pairAverage;
    transVec[diffFromAvgs+i] = vec[i] - pairAverage;
}

return haar1d(transVec, seriesAverage);
}

主に:

vector<double> result = haar1d(series, avg);

for(vector<double>::iterator it = result.begin(); it != result.end(); ++it)
{
    cout << *it << ",";
}
4

1 に答える 1

6

いいえ、operator<<引数を変更しません。そのまま印刷します。ただし、関数は次のようになります。

double* haar1d(/* ... */)
{
  double arr[N];
  // Fill this array
  return arr;
}

重要なのは、配列arrが関数に対してローカルであるということです。関数が終了すると破棄されます。ただし、最初の要素へのポインタを返しています。ポインタが指す配列が破棄されているため、そのポインタは関数の外部では無効になります。このポインタを使用すると、未定義の動作が呼び出されるため、値がランダムに変化し始めても驚かないでください。

配列サイズがコンパイル時定数であるかどうかに応じて、std::array<double, N>またはのいずれかを使用することをお勧めします。std::vector<double>これらのいずれかを返すと、その内容が呼び出し元の関数にコピーされます。

私が正しく推測している場合2は、配列のサイズとして指定した引数を使用している可能性があります。これがコンパイル中の場合は、可変長配列拡張を備えたコンパイラを使用しており、コードは標準のC++ではありません。

于 2013-01-12T18:15:40.307 に答える