0

私の知る限り、これは無限再帰が原因ではありません。

プログラムは、より小さな配列で正しく機能しました (これはオーディオ エディターです)。今では、より大きな配列 (最大 5 分間のオーディオ、26460000 個の 16 ビット データ ~50 MB) を可能にする機能を強化しました。

配列のサイズを大きくしてから、ある特定の関数でスタック オーバーフロー エラーが発生しました。この関数では、配列を新しい配列に逆方向に書き込み、元の配列を上書きして、入力ファイルの再生を逆にする必要があります。各配列は最大 50MB になる可能性があるため、これが問題の原因である可能性があると推測しています。

//initialise temporary new array to place samples in
short signed int reverse_data[max_number_samples];  

for (i=0; i<track_samples; i++)
{  //puts data from sound_data into reverse_data backwards.
  reverse_data[(max_number_samples-1)-i]=sound_data[i];    
}

for (i=0; i<track_samples; i++)    
{     //now overwrites sound_data with the data in reverse_data
  sound_data[i]=reverse_data[i];
}

私は C++ とプログラミング全般にかなり慣れていないため、デバッグ中に発生するエラーが実際に何を示しているのかわかりません。

簡単な解決策があると確信しています(「ヒープ」に関するものを読んだことがありますが、「ヒープ」が実際に何であるかについては確信が持てません)。

4

2 に答える 2

6

スタックのサイズには制限があるため、スタックに大きなデータ構造を割り当てないでください。ヒープに割り当てます。

さらに良いことに、手動の割り当てを避けstd::vectorて、メモリ割り当て自体を処理する を使用する必要があります。おまけとして、解放を気にする必要はありません。(そして、これが最新の C++ の方法です。)

ところで、max_number_samplesが大きい場合は、おそらく必要な分だけ割り当てる必要があります。

std::vector<short int> reverse_data(track_samples);

(残りのコードはそのまま残ります)。

編集:
さらに良いアイデア:追加の配列にコピーせずに、配列をその場で逆にすることができます! インデックス 0 から半分のサイズに移動し、ith と(size - 1 - i)th の項目を交換するだけです。

for (i=0; i < track_samples/2; i++)
{
    std::swap(sound_data[i], sound_data[track_samples-1-i]);
}
于 2012-05-10T14:45:42.567 に答える
3

Vladが指摘したように、スタックに 50MB を割り当てないでください。

ただし、データを割り当てる必要がないため、その点は議論の余地があります。コード フラグメント全体を次の 1 回の呼び出しに置き換えてみてくださいstd::reverse

std::reverse(&sound_data[0], &sound_data[track_samples]);


追記:忘れずに#include <algorithm>

于 2012-05-10T14:59:54.497 に答える