2012-05-10 61 views
0

據我所知,這不是由無限遞歸造成的。堆棧溢出visual C++,潛在的數組大小?

該程序用較小的陣列(它是音頻編輯器)正確地發揮作用。現在我增加了功能,以允許更大的陣列(音頻最多5分鐘,16位數據26460000個〜50MB)。

由於增加了數組的大小,我正在接收一個特定函數的堆棧溢出錯誤,它應該通過向後將數組寫入新數組來反轉輸入文件的播放,然後覆蓋原始數組。我猜每個陣列可高達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++,和一般的編程,和我不能確定過程中出現了錯誤的東西調試真的告訴我。

任何幫助,將不勝感激,我敢肯定有一個很簡單的解決辦法(我讀過的東西,涉及「堆」,但我不相信什麼a'heap」確實是)。

+0

確定'REVERSE_DATA [(max_number_samples-1)-i]'是正確的?您只將數據寫入'reverse_data'數組的末尾部分,但是從頭開始讀取它們。 – Vlad

+0

啊,我沒有看到這個評論。你是對的,但是我用另一個循環來搜索音頻的開始,並且只從音頻的開頭將數據寫入結尾。非常感謝你的幫助! – holmes321

回答

3

由於弗拉德pointed out,不要在棧上分配50MB。

但是,這一點是沒有意義的,因爲您不需要分配任何數據。嘗試用一個單一的通話更換整個代碼片段std::reverse

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


後記:不要忘記 #include <algorithm>

+0

這個工作完美,謝謝!真的很有效率 – holmes321

6

你不應該在棧上分配大型數據結構,因爲棧的大小是有界的。分配在堆上。

更妙的是,你應該避免手動分配和使用std::vector,這會關心內存分配本身。作爲獎勵,您不需要關心重新分配。 (這是現代C++的方式。)

順便說一句,如果max_number_samples大,你或許應該只分配儘可能多的,因爲你需要:

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

(你的代碼的其餘部分保持原樣是)。

編輯:
更好的主意:你可以反轉你的數組,而無需複製到一個額外的數組!從指數0只要到一半的大小和交換i日和(size - 1 - i)個項目:

for (i=0; i < track_samples/2; i++) 
{ 
    std::swap(sound_data[i], sound_data[track_samples-1-i]); 
} 
+0

+1 ...並且不要對這麼多的數據使用遞歸! –

+0

啊謝謝,所以問題在於陣列的大小,正如我所料! 我將如何初始化我的數組在堆上,而不是堆棧? – holmes321

+0

@ holmes321:查看更新後的答案。 – Vlad