Programm bricht ab (keine Fehler beim Compilieren)



  • Hallo,
    habe eine Programm, das beim Compilieren keine Fehler angibt, aber beim Ausführen dann abbricht und mit Code -1073741819 terminiert (ka, ob das was bedeutet)

    Es muss an folgender kleinen Funktion liegen, die im Programm auftaucht. Wenn ich die rauskommentiere, läuft alles.

    int findset(int a,struct ARBOR *arbor){
    	while(arbor[a].father!=a){
    		a=arbor[a].father;
    	}
    	return a;
    }
    

    Ich vermute irgendwie, dass die Anweisung a=arbor[a].father nicht richtig ist und zu Problemen führt, aber ich raff nicht, wieso.

    Falls das zum Verständnis hilft: Die Fuktion soll solange den Vater eines Knotens in einem Graphen suchen, bis sie einen Knoten findet, dessen Vater der Knoten selbst ist und den Index dieses Knotens ausgeben.

    Hoffe, mir kann jemand helfen. Wenn ihr mehr Infos braucht, bitte melden.



  • Führe deine Anwendung als Debug-Version aus, dann solltest du schon mal mehr Information bekommen. Und dann sieh dir einfach mal die Werte an, wenn es kracht. Wahrscheinlich wendest du einen ungültigen Index an oder sowas...



  • Hab wenig Ahnung und bin mir nicht sicher, was du meinst, aber hilft sowas?

    Debugger has started.
    Program has received a signal-name="SIGSEGV",signal-meaning="Segmentation fault" at findset({name="a",value="-1414812757"},{name="arbor",value="0x3e2688"}), file C:\MinGWStudio\Samples\MessageBox\matching\kruskal\kruskal.c:39

    Zeile 39 ist übrigens die mit dem "While".



  • value="-1414812757"

    das sieht nicht so gut aus.
    🙂



  • Sorry, aber wir koennen dir nicht helfen. Wir haben keine Kenntnisse ueber den Aufbau von struct ARBOR *arbor und wie die "Objekte" miteinander verknuepft sind. Wahrscheinlich handelt es sich dabei um nicht-initialisierte Variablen. Es scheint, dass ein (oder mehrere) Knoten keinen Vater hat und dieser Fall nicht beruecksichtigt oder nicht initialisiert wurde.



  • Naja, trotzdem danke für die Antworten. Das mit dem Debugger hat mir wenigstens mal bestätigt, dass es an der Stelle liegt. Ich werd mal weiter suchen.



  • alx3400 schrieb:

    Naja, trotzdem danke für die Antworten.

    knivil meinte wohl eher, dass du mal mit mehr Code+Infos rausrücken sollst und nicht, dass wir gar nicht helfen wollen/können. 🙂

    Und ich schließe mich den anderen an, wenn a= -irgendwas, geht was total schief (Variable nicht initialisert oder so). Nutze den Debugger ("use the debugger, luke!"). Setze Breakpoints, gehe mal Schritt für Schritt durch usw.



  • alx3400 schrieb:

    Hallo,
    habe eine Programm, das beim Compilieren keine Fehler angibt, aber beim Ausführen dann abbricht und mit Code -1073741819 terminiert (ka, ob das was bedeutet)

    Es muss an folgender kleinen Funktion liegen, die im Programm auftaucht. Wenn ich die rauskommentiere, läuft alles.

    int findset(int a,struct ARBOR *arbor){
    	while(arbor[a].father!=a){
    		a=arbor[a].father;
    	}
    	return a;
    }
    

    Ich vermute irgendwie, dass die Anweisung a=arbor[a].father nicht richtig ist und zu Problemen führt, aber ich raff nicht, wieso.

    Falls das zum Verständnis hilft: Die Fuktion soll solange den Vater eines Knotens in einem Graphen suchen, bis sie einen Knoten findet, dessen Vater der Knoten selbst ist und den Index dieses Knotens ausgeben.

    Hoffe, mir kann jemand helfen. Wenn ihr mehr Infos braucht, bitte melden.

    Hallo,
    die Funktion an sich sieht in ordnung aus, auch wenn sie keinen Sinn ergibt, denn sie macht nur das hier:

    int findset(int a,struct ARBOR *arbor){
    return arbor[a].father;
    }
    

    Ich nehme an, die Funktion soll nach dem Inhalt eines Structmembers suchen und dann den Wert oder den Index des Arrays liefern - dafür fehlen allderdings Indexinkrementierung, Arraygrenzencheck, Abbruchbedingung.
    Dein SegFault kommt vermutlich dadurch zustande, das ein ungültiger Index übergeben wird, d.h. das der Wert a größer ist als die Anzahl der im Array enthaltenen Instanzen minus -1.
    Gruß,
    B.B.



  • Big Brother schrieb:

    Dein SegFault kommt vermutlich dadurch zustande, das ein ungültiger Index übergeben wird, d.h. das der Wert a größer ist als die Anzahl der im Array enthaltenen Instanzen minus -1.
    Gruß,
    B.B.

    Der Grund kann aber auch an einer ganz anderen Stelle im Code liegen und sich erst beim Eintritt in die Funktion bemerkbar machen.
    Mehr Code zu sehen, wäre dann nötig.



  • Hat sich alles geklärt. Hab rausgefunden, dass die Funktion nur beim letzten Aufruf während des Programms Ärger macht und das lag dann daran, dass Arrays natürlich bei 0 und nicht bei 1 anfangen und ich die Funktion dadurch mit Werten aufgerufen hab, die es in dem Array arbor nicht gab. Ziemlicher Anfänger-Fehler bestimmt.

    Nochmal danke für die Antworten.


Anmelden zum Antworten