Problem bei einem Verwaltungsprogramm

OP #1801377
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 :/
Gast #1801388
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
Gast #1801429
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.
Gast #1801451
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.
OP #1801627
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren