www.mikrocontroller.net

Forum: PC-Programmierung Problem bei einem Verwaltungsprogramm


Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe ein Verwaltungsprogramm in C geschrieben, jedoch habe ich einen 
kleinen Fehler den ich selber irgendwie nicht wirklich finde. Es handelt 
sich auch nur um eine kleine Stelle im Code.
void sortieren(int num, char nam[])
{
     struct verwaltung *ptr1,*ptr2;
     if(first_element==NULL)
        uebernehmen(num,nam);
     else
     {  
         ptr1=first_element;
         while((num>ptr1->nummer) && (ptr1!=NULL))
            {ptr1=ptr1->next;}
         if(ptr1==NULL)                    
            uebernehmen(num,nam);
         
         else if(ptr1==first_element)
         {
              first_element=malloc(sizeof(struct verwaltung));
              first_element->nummer=num;
              strcpy(first_element->name, nam);
              first_element->next=ptr1;
         }
         else
         {
             ptr2=first_element;
             while(ptr2->next!= ptr1)
                ptr2=ptr2->next;
             ptr1=malloc(sizeof(struct verwaltung));
             ptr1->nummer=num;
             strcpy(ptr1->name,nam);
             ptr1->next=ptr2->next;
             ptr2->next=ptr1;
         }
     }
}
Das was das Programm nicht macht ist der Vergleich hier: 
while((num>ptr1->nummer) && (ptr1!=NULL))
Der Compiler spuckt zwar keinen Fehler aus, aber das Programm 
funktioniert nicht und stürzt ab. Nun habe ich den Fehler eingeengt. 
Sobald ich den ersten Vergleich der Schleife ausklammere 
(num>ptr1->nummer) stürzt das Programm nicht mehr ab. Ist er drin stürzt 
es ab. Ich weiß nur leider nicht, woran das jetzt liegen könnte :/

Autor: stefan hennig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while((num>ptr1->nummer) && (ptr1!=NULL))
...
C führt shortcut-evaluation durch, und zwar von links nach rechts. 
Stelle den Vergleich auf NULL nach links, sonst wird ggf. doch ein 
NULL-Pointer dereferenziert.

Viele Grüße,
  Stefan

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vertausch mal die Bedingungen
while((ptr1 != NULL) && (num > ptr1->nummer))
Sonst greifst Du u.U. auf einen NULL-Pointer zu und erzeugst eine 
Zugriffsverletzung.

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, es funktioniert danke :) aber wenn ich ehrlich bin versteh ich moch 
immer nicht ganz wieso auf einmal. Nur weil ich die Bedingung getauscht 
habe..?

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. J. schrieb:
> Nur weil ich die Bedingung getauscht
> habe..?

Ja. Denn die Reihenfolge der Bedingungen im Programmtext bestimmt die 
Reihenfolge in der die Bedingungen abgearbeitet werden.

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, okay...aber ich versteh leider die Problematik nicht, wenn ich 
zuerst die andere Bedingung abfrage :/

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. J. schrieb:
> aber ich versteh leider die Problematik nicht, wenn ich
> zuerst die andere Bedingung abfrage

Das verstehe ich wiederum nicht. Du hast bei mir den Eindruck erweckt, 
das Du den Code selbst geschrieben hast.

L. J. schrieb:
> Ich habe ein Verwaltungsprogramm in C geschrieben...

Nun. Vielleicht ist Dir da ein Irrtum unterlaufen und Du hast nicht 
daran gedacht, das Du gerade diese eine Zeile nicht selbst geschrieben 
hast. Kann ja mal vorkommen.

Also Du oder Dein Alter Ego, haben, als sie die Zeile:
while((ptr1 != NULL) && (num > ptr1->nummer))
geschrieben haben, gedacht: "Ich will in der verkettenen Liste 
fortschreiten, bis ich einen Nummer, groesser oder gleich num finde. 
Aber ach, es könnte ja sein, das sich so eine Nummer nicht findet; was 
dann? Dann gelange ich an das Ende der Liste," hast Du (o.D.A.E.) 
gedacht, "und erkenne dies mit dem Test ptr1 != NULL)". Dann hast Du 
(o.D.A.E.) nichtmehr gedacht, denn die Frage ob die Bedingung (num > 
ptr1->nummer) überhaupt sinnvoll auszuwerten ist, haengt davon ab ob die 
andere Bedingung (ptr1 != NULL) wahr ist. Ergo muss diese zuerst 
ausgewertet werden, damit nicht versehentlich mit prt1 == NULL die 
zweite Bedindung ausgewertet wird.

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nicht alles selber geschrieben das ist wahr. Einen Teil habe 
ich aus einem Buch genommen. Da stand eine Abfrage halt so drin. Aber 
ich habe es jetzt verstanden :) Vielen Dank !

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. J. schrieb:
> Einen Teil habe
> ich aus einem Buch genommen.

Das sollte Dich lehren niemals etwas unverstanden aus einem anderen Text 
zu übernehmen.

Jaa. Ich kenne Die Antwort: Du hast mehrere C-Buecher gelesen und den 
VHS-Kurs besucht, aber dieses kleine Detail war Dir irgendwie durch 
die Lappen gegangen.
In jedem Fall lies das C-Buch nochmal. Das ging einigen von den heutigen 
Könnern nicht anders.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. J. schrieb:
> Da stand eine Abfrage halt so drin

Sicher?
Dann gehört das Buch in den nächsten Reißwolf.

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grrrr schrieb:
> Jaa. Ich kenne Die Antwort: Du hast mehrere C-Buecher gelesen und den
> VHS-Kurs besucht, aber dieses kleine Detail war Dir irgendwie durch
> die Lappen gegangen.

Leider ist das erste falsch...das zweite ist auch falsch. Das war mein 
erstes C-Buch. Einen VHS-Kurs habe ich auch nicht besucht. Ich brauch 
keine Ausrede dafür das ich es nicht verstanden habe. Ich hab's ja 
schließlich auch gesagt ;) Deswegen habe ich mich an euch gewendet.

... schrieb:
> Sicher?

Nein. Mein Fehler. Es stand nicht so im Buch. Da war es eben richtig. 
Aber da ich halt nicht alles ablesen wollte habe ich auf eigene Faust 
programmiert und da ist mir nun dieser Fehler unterlaufen. Tut mir 
Leid^^

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.