2012-10-15 106 views
0

我有一些用C++編寫的代碼,當我在筆記本電腦上編譯它時,結果顯示,但是,我試圖編譯代碼並將其運行到RPI上,並且出現錯誤:Raspberry Pi C++分段錯誤

Segmentation fault

程序(目前)工作原理:

  • 讀取的(.WAV)文件到雙打的載體( 「RAWDATA」)
  • 拆分RAWDATA成塊(blockked)

當我嘗試將數據分割成塊時,會發生分段錯誤。大小:

RAWDATA - 57884 blockked - 112800

現在我所知道的唯一的RPI擁有256MB,這可能可能是問題,或者,我是不正確地處理數據。我已經包括了一些代碼爲好,以協助表明事物是如何運行:

(main.cpp中):

int main() 
{ 
int N = 600; 
int M = 200; 

float sumthresh = 0.035; 
float zerocorssthres = 0.060; 

Wav sampleWave; 

if(!sampleWave.readAudio("repositry/example.wav", DOUBLE)) 
{ 
    cout << "Cannot open the file BOOM"; 

} 

// Return the data 
vector<double> rawData = sampleWave.returnRaw(); 
// THIS segments (typedef vector<double> iniMatrix;) 
vector<iniMatrix> blockked = sampleWave.something(rawData, N, M); 


cout << rawData.size(); 

return EXIT_SUCCESS; 
} 

(功能:東西)

int n = theData.size(); 
int maxblockstart = n - N; 
int lastblockstart = maxblockstart - (maxblockstart % M); 

int numblocks = (lastblockstart)/M + 1; 
vector< vector<double> > subBlock; 
vector<double> temp; 
this->width = N; 
this->height = numblocks; 

subBlock.resize(600*187); 
for(int i=0; (i < 600); i++) 
{ 
    subBlock.push_back(vector<double>()); 
    for(int j=0; (j < 187); j++) 
    { 
     subBlock[i].push_back(theData[i*N+j]); 
    } 
}  
return subBlock; 

任何建議將不勝讚賞:)!希望這是足夠的描述。

+0

'海圖[I * N + J]'看起來很可疑。另外'subBlock.resize(600 * 187);'似乎是一個錯誤。您不是在這裏創建2維數組,而是1-d。 – Lol4t0

+0

你也在循環中使用push_back,這意味着你有一堆空的'vector ',然後加上 – Collin

+0

謝謝你的回覆。 @Collin我看到你提到的空矢量。我可能會重新考慮如何重寫代碼。儘管問題很快..爲什麼它會在我的筆記本電腦上工作,但不是在RPI上? – Phorce

回答

2

您可能在某處超出了某個數組(甚至可能不在您發佈的代碼中)。我不太確定你想要做什麼,但是我想你想把你的wave文件分成600個樣本塊?

如果是這樣,我想你想要更多的東西像下面這樣:

std::vector<std::vector<double>> 
SimpleWav::something(const std::vector<double>& data, int N) { 

    //How many blocks of size N can we get? 
    int num_blocks = data.size()/N; 

    //Create the vector with enough empty slots for num_blocks blocks 
    std::vector<std::vector<double>> blocked(num_blocks); 

    //Loop over all the blocks 
    for(int i = 0; i < num_blocks; i++) { 
     //Resize the inner vector to fit this block    
     blocked[i].resize(N); 

     //Pull each sample for this block 
     for(int j = 0; j < N; j++) { 
      blocked[i][j] = data[i*N + j]; 
     } 
    } 

    return blocked; 
} 
+0

非常感謝:)!它應該生產96塊嗎?是的,600塊,但它們有時應該重疊。 – Phorce

+0

重疊?從你的尺寸,是96塊聽起來是正確的。 – Collin

+0

這就是我在教程中得到的:這個函數將矢量分成塊。每個塊的大小爲N.並且連續的塊的起始位置與M不同。通常N = 30毫秒(600個採樣)M = 10毫秒(200個採樣)。每個塊中有600個採樣,並且具有不同的開始職位..所以對我來說,一切都很好! – Phorce