2009-06-15 17 views
1

Ich habe die Erklärung folgende Datenstruktur, auf dem ich die folgende Operation machen:Busfehler/Segmentierungsfehler für std :: vector <int> Erklärung

//QSweep.cpp 
void QSweep:: createLoops(){ 

std:: vector<int> orientationUE; 
if (test1) 
    orientationUE.push_back(1); 
else 
    orientationUE.push_back(-1); 

Alles funktioniert so weit in Ordnung. Das Problem ist, dass ich mehrere Dateien habe und ich will, dass orientUE eine Daten der Klasse QSweep nicht nur eine lokale Variable in der Methode createLoops() ist. So habe ich die Deklaration der Variablen orientationUE in der Datei QSweep.h

//QSweep.h 
class QSweep{ 
    .... 
    std::vector<int> orientationUE; 
    .... 
} 

//QSweep.cpp 
void QSweep:: createLoops(){ 
    if (test1) 
    orientationUE.push_back(1); 
    else 
    orientationUE.push_back(-1); 
} 

In diesem Fall erhalte ich entweder eine Bus Fehlermeldung oder eine Segmentierung Fehlermeldung je nachdem, wo ich in den

meine Variable orientationUE erklärt
class QSwepp{ 
    .... 
    } 

Ich verstehe nicht genau, was passiert.

ADD: Ja habe ich mehrere Speicherzuweisung und mehrere andere Deklaration von Variablen des Typs Vektor (eigentlich viel). Z.B .:

typedef Seq< vector<int> > MxInt2d; 
class QSweep 
{ 
public: 
    QSweep(){}; 
    QSweep(const MxDouble2d& myPoints, const MxInt2d& myEdges); 
    void intersection(); 

    //data and functions for inserting the missing edges in the graph 
    void completeGraph(); 

    MxInt2d myEFCG; 
    std::vector<int> vNoClone; 
    std::vector<int> vEdge; 

    .... 

    int nbIntersections; 
    MxInt2d sweepEvents; 
    std::vector<double*> myIntersections; 
}; 

Noch habe ich eine Menge von Algorithmen auf diese Datentypen angewendet und ich erhalte die Ergebnisse ohne keine Segmentierungsfehler oder Bus Fehlermeldung. Sie denken also, der Fehler liegt irgendwo in den anderen Speicherzuordnungsaufträgen. Uff .. Ich hatte davor Angst. Dennoch verstehe ich die guten Ergebnisse nicht, sie sind jedoch irreführend? Und wie kann ich in diesem Fall genau den Fehler erkennen?

ADD_NEXT:

Der Vektor myIntersections wird auf folgende Weise erstellt:

double* QSweep::computeIntersection(double m1, double b1, double m2, double b2){ 
double* v=new double[3]; 

v[0]= (b2-b1)/(m1-m2); 
v[1]= (m1*b2-m2*b1)/(m1-m2); 
v[2]=0.00; 

return v; 
} 


double* QSweepComplete::findIntersection(edge_t edge1, edge_t edge2){ 
    double* vector=NULL; 

     if (test2){ 
      return NULL; 
     } 
     else{ 
      vector=computeIntersection(m1,b1,m2,b2); 
      return vector; 
     }   
} 

void QSweep:: intersection(){ 
    double* vector=NULL; 
    vector=findIntersection(edge1,edge2); 
    if (vector!=NULL){ 
    myIntersections.push_back(vector); 
    } 
} 

Wenn ich der Vektor myIntersections alles zeigen in Ordnung ist, und dass ich immer die richtige Größe: wenn ich 5 haben Schnittpunkte, 5 Elemente im Vektor und so weiter. Für mich ist es sehr sauber aussieht, aber leider wahrscheinlich ist es nicht

ADD_LAST (MAYBE GELÖST) :(: Hey alle

Es scheint, das Problem war, die Daten

int nbIntersections; 

die Ich initialisierte es nur lokal in einer Funktion in QSweep.cpp; Dennoch benutze ich viele Vektoren der gleichen Größe mit nbIntersections, so dass die Variable in einigen Fällen einige nicht vorhandene Daten enthielt .. Also habe ich den Konstruktor hinzugefügt und initialisiert es mit 0, und jetzt ist es Ich habe keine Probleme mehr mit den Segmentierungsfehlern oder Busfehlermeldungen. Ich hoffe, das war der Fehler.

+0

Können Sie weitere Informationen zu diesem Satz bereitstellen: "Ich erhalte entweder eine Busfehlermeldung oder eine Segmentierungsfehlermeldung, je nachdem, wo ich meine Variablenausrichtung deklariert habe"? Ansonsten sehe ich nichts falsch mit dem Code. – Naveen

+0

Wie werden myIntersections verwendet? Zeigen die Elemente auf einen anderen Vektor? –

+0

Wie gehen Sie zum Löschen dieser Arrays von Doppel, die Sie zuweisen? –

Antwort

0

Es scheint nichts offensichtlich falsch mit dem Code zu sein, den Sie gepostet haben. Wie erstellen Sie das QSweep-Objekt? Kannst du den Code auf ein einfaches Beispiel eingrenzen und das posten?

1

Es hat nichts mit dem Code zu tun, den Sie gepostet haben. Das Problem muss woanders liegen. Nehmen Sie eine dynamische Speicherzuordnung vor? Wenn dem so ist, ist es wahrscheinlich vermasselt, und die Verwendung des Vektors (der auch die dynamische Zuweisung durchführt) stellt lediglich das Problem dar.

Da Ihr Code viele Vektoren verwendet, ist ein anderes mögliches Problem der Zugriff über den Vektoroperator. Diese werden nicht überprüft und können schwer zu finden sein. Das einzige, was ich vorschlagen kann, ist Code-Inspektion und vernünftige Verwendung der Vektor at() Access-Funktion, die einen Fehler auf Grenzen Verletzung werfen wird.

Abhängig von Ihrer Plattform sollten Sie möglicherweise auch Debugging-Tools wie Valgrind verwenden.

Bearbeiten: Ihr Vektor von Zeigern zu doppelt scheint mir sehr verdächtig - es gibt nicht Fälle, in denen eine solche Datenstruktur gute Lösung ist. Ich würde mir genau ansehen, wie das verwendet wird.

0

Wie andere angaben, ist an diesem Code nichts falsch. Ich kann nur daran denken, dass Sie, wenn Sie die Größe der Klasse ändern (indem Sie eine zusätzliche Membervariable hinzufügen), alle Binärdateien (wenn es mehrere Binärdateien gibt), die davon abhängig sind, erstellen müssen. Andernfalls wird die Größe des erstellten Objekts inkonsistent sein.

+0

alle Binärdateien? (Ich verstehe nicht, was diese Binärdateien auch verweisen, sorry und danke) – madalina

+0

Binärdateien wären alle Objektdateien in Ihrem Build enthalten. Im Grunde ist ein sauberer Wiederaufbau von allem, was Sie hier brauchen. – ypnos

1

Da es uns nicht möglich ist, die Ursache zu ermitteln, indem Sie den Code zu diesem Zeitpunkt betrachten, sollten Sie mit einem Debugger darauf arbeiten. Ich persönlich empfehle valgrind. Es ist sehr gut, die Ursache früher zu finden, als wenn der segfault tatsächlich auftritt.

0

Funktioniert QSweeps 2-Parameter-Konstruktoraufruf in seiner Initialisiererliste, z.

Das hängt von der Deklarationsreihenfolge der Klassenmitglieder ab und könnte daher Ihr Problem verursachen. Die Elementfunktion könnte den Elementvektor vor dem Erstellen aufrufen.

Verwandte Themen