Forum: PC-Programmierung Problem bei einem Verwaltungsprogramm


von L. J. (luke1)


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.
1
void sortieren(int num, char nam[])
2
{
3
     struct verwaltung *ptr1,*ptr2;
4
     if(first_element==NULL)
5
        uebernehmen(num,nam);
6
     else
7
     {  
8
         ptr1=first_element;
9
         while((num>ptr1->nummer) && (ptr1!=NULL))
10
            {ptr1=ptr1->next;}
11
         if(ptr1==NULL)                    
12
            uebernehmen(num,nam);
13
         
14
         else if(ptr1==first_element)
15
         {
16
              first_element=malloc(sizeof(struct verwaltung));
17
              first_element->nummer=num;
18
              strcpy(first_element->name, nam);
19
              first_element->next=ptr1;
20
         }
21
         else
22
         {
23
             ptr2=first_element;
24
             while(ptr2->next!= ptr1)
25
                ptr2=ptr2->next;
26
             ptr1=malloc(sizeof(struct verwaltung));
27
             ptr1->nummer=num;
28
             strcpy(ptr1->name,nam);
29
             ptr1->next=ptr2->next;
30
             ptr2->next=ptr1;
31
         }
32
     }
33
}
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 :/

von stefan hennig (Gast)


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

von ... (Gast)


Lesenswert?

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

von L. J. (luke1)


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..?

von Grrrr (Gast)


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.

von L. J. (luke1)


Lesenswert?

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

von Grrrr (Gast)


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.

von L. J. (luke1)


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 !

von Grrrr (Gast)


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.

von ... (Gast)


Lesenswert?

L. J. schrieb:
> Da stand eine Abfrage halt so drin

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

von L. J. (luke1)


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^^

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.