Problem bei einem Verwaltungsprogramm

OP #1801377
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
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 #1801390
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.
Gast #1801429
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.