2012-04-04 25 views
1

OSX 10.7, XCode 4.push_back Ausgabe std :: vector

Ich habe ein kleines Problem: Ich brauche eine 2D vector<vector<float>> in zu einem 3D-Vektor, nach einem Prozess der Auswahl zurück zu drängen. Es löst den Fehler EXC_BAD_ACCESS in der Funktion push_back in der Schablone stl :: vector aus. Es scheint, dass es einfach sein sollte (ich habe schon oft mit komplexen Datenstrukturen gearbeitet), ich habe eine variierende Menge an Ideen ausprobiert, aber ohne Erfolg. Alles andere funktioniert und gibt die Werte aus, die ich von der Befehlszeile erwarten würde. Ich bin sicher, dass seine Code Blindheit und einige einfache Wiederholung zu übernehmen.

Ich frage nur, weil ich glaube, dass meine Syntax korrekt ist, aber zur Kompilierzeit habe ich Probleme. Heres Code einige Beispiel:

Umsetzung:

for(int i=0;i<fdisVec.size();i++){ 

    int j; 

     if(fdisVec[i] < fdisVec2[i]){ 

      j = 0; 

     } 

     else if(fdisVec2[i] < fdisVec[i]){ 

      j = 1; 

     } 

    clusters[j].push_back(allMfccs[i]); 

} 

und meine .h hat die als solche (öffentliche Mitglieder der Klasse) deklarierten Objekte:

vector< vector <float> > allMfccs; 
    vector< vector < vector <float> > > clusters; 

Im Fall hilft es, fdisVec und fdisVec2 sind auch 2d Vektoren, aber die "if else" Anweisung antwortet, wie ich es will - ich bezweifle stark, dass es etwas damit zu tun haben würde.

+0

Wenn es sich um vecs von vecs von floats handelt, sollten Sie einen Matrixtyp wie boost :: numeric :: ublas :: matrix in Betracht ziehen. Es hat eine STL-ähnliche Schnittstelle. Versuchen Sie es mit .at() anstelle von [] und prüfen Sie, ob eine Ausnahme ausgelöst wird. – 111111

+0

Was sind die Größen? Kann Ihnen der Speicher ausgehen? –

+0

Wenn die Werte gleich sind, ist "j" unintialisiert. – hmjd

Antwort

1

Was ist, wenn fdisVec [i] == fdisVec2 [i]?

In diesem Fall bleibt j nicht initialisiert (Müll) und manchmal ist der Wert kein gültiger Index für Ihren Clustervektor.

+0

Ich habe gerade versucht, das if in ein if (fdis

+0

Was ist der Wert von clusters.size()? allMfccs.size()? fdisVec.size()? –

+0

allMfccs.size() = 2998, fdisVec.size() = 2998, clusters.size() = 0. Ich habe noch keine Cluster verwendet, diese Schleife befasst sich mit dem Prozess des korrekten Auffüllens dieses 3D-Vektors. –

1

Trotz der Tatsache, dass ein Problem sein wird (wie in Antwort von @VaughnCato diskutiert) der Zugriff auf ein Element des Clusters führt nicht zu einem Kompilierungsfehler, aber höchstwahrscheinlich zum Absturz Ihres Programms, wenn Sie es ausführen.

Der Fehler bei der Kompilierung ist jedoch darauf zurückzuführen, dass clusters[j] einen vector< vector<float> > erwartet, aber allMfccs[i] ist nur ein vector<float>.

Also nach Ihrer Erklärung von clusters und allMfccs, müssten Sie allMfccs drücken.

Verwandte Themen