2012-10-15 6 views
0

J'ai du code écrit en C++ et quand je le compile sur mon ordinateur portable, les résultats montrent cependant que j'ai essayé de compiler et d'exécuter le code sur le RPI et j'ai l'erreur:Raspberry Pi C++ Segmentation fault

Segmentation fault

Comment le programme (actuellement) fonctionne:

  • Reads dans un (.wav) dans un vecteur de double ("rawData")
  • Divise le rawData en blocs (blockked)

La faute de segmentation se produit lorsque j'essaie de scinder les données en blocs. Les tailles:

RAWDATA - 57884 blockked - 112800

Maintenant, je sais que le RPI ne dispose que de 256 Mo et cela pourrait peut-être le problème, ou, je ne suis pas manipuler les données correctement. J'ai inclus un code aussi bien, pour démontrer comment les choses sont en cours d'exécution:

(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; 
} 

(fonction: quelque chose)

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; 

Toute suggestion serait grandement apprécié :)! J'espère que c'est assez description.

+0

'theData [i * N + j]' semble suspect. Aussi 'subBlock.resize (600 * 187);' semble être une erreur. Vous ne créez pas de tableau 2-d ici, mais 1-d. – Lol4t0

+0

Vous utilisez également push_back dans la boucle, ce qui signifie que vous avez un tas de 'vecteur vide ', puis ajouter à cela – Collin

+0

Merci pour vos deux réponses. @Collin Je vois le vecteur vide que vous avez mentionné. Je pourrais reconsidérer comment je réécrirais le code. Question rapide si .. Pourquoi ça marche sur mon ordinateur portable, mais pas sur le RPI? – Phorce

Répondre

2

Vous êtes probablement envahir un tableau quelque part (peut-être même pas dans le code que vous avez posté). Je ne suis pas vraiment sûr de ce que vous essayez de faire avec le blocage, mais je suppose que vous voulez diviser votre fichier wave en 600 morceaux d'échantillon?

Si oui, je pense que vous voulez quelque chose de plus comme ce qui suit:

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

Merci beaucoup :)! Devrait-il produire 96 blocs? Et oui, 600 morceaux, mais ils devraient parfois se chevaucher. – Phorce

+0

Chevauchement? De vos tailles, ouais 96 blocs sonne bien. – Collin

+0

Voici ce que j'ai compris dans le tutoriel: Cette fonction sépare le vecteur en blocs. Chaque bloc a la taille N. et les blocs consécutifs diffèrent dans leurs positions de départ par M Typiquement N = 30 msec (600 échantillons) M = 10 msec (200 échantillons). Il y a 600 échantillons dans chacun des blocs, et, ont différents début positions .. Donc, pour moi, tout semble bon! – Phorce