große verwirrung mit pointern !!
-
hi nochmal..
hier wurde uns ein programm vorgebastelt was wir uns anschauen und verstehen sollten..allerdings habe ich schon noch etwa 5minuten eine stelle gefunden, an der ich jetzt seit etwa einer stunde sitze..meine fragen:
- wo zum teufel wird die funktion "enter()" deklariert und warum wird sie obwohl sie nichteinmal aufgerufen wird TROTZDEM im menüpunkt 1 aufgerufen, obwohl da nur "last = insert(last) steht..?- was soll das
if (first == Null) first = akt = last;
??verstehe ich ebenfalls nicht falls mir das jemand erklären kann..tut mir leid..
gut eigentlich habe ich noch 2 bis 3 weitere fragen aber die stelle ich erst wenn ich den kram hier verstanden habe..
wenn mir jemand helfen könnte, diese riesige verwirrung in form von pointern und structs zu lüften, wäre ich sehr sehr dankbar.
ps: ich habe durchaus verständnis dafür wenn dem einen oder anderen der quellcode zu lang ist und kein bock hat mir zu helfen -.-
hier der gesammte quellcode des programmsgruß
steffen#include <stdio.h> #include <stdlib.h> #include <string.h> #define Null (struct fachbuch *)0 struct fachbuch { char titel [256]; char autor [128]; int auflage; char isbn [32]; double preis; struct fachbuch * next; }; int menu () { /* gibt int 1 bis 8 fuer Auswahl zurueck, 0 = Abbruch */ int helpme; printf (" *** MENUEAUSWAHL ***\n"); printf (" 1 = Anhaengen eines Buches\n"); printf (" 2 = Ganze Liste anzeigen\n"); printf (" 3 = Vorherigen Datensatz anzeigen\n"); printf (" 4 = Naechsten Datensatz anzeigen\n"); printf (" 5 = Ersten Datensatz anzeigen\n"); printf (" 6 = Einfuegen hinter aktueller Position\n"); printf (" 7 = Datensatz suchen\n"); printf (" 8 = Aktuellen Datensatz aendern\n"); printf ("sonst: Programmende\n"); printf ("Ihre Auswahl: "); scanf ("%d", &helpme); if (helpme < 1 || helpme > 8) helpme =0; return helpme; } void enter (struct fachbuch * ap) { /* Nutzdaten von der Tastatur einlesen */ if (ap == Null) { printf ("enter: Fehler: Nullzeiger statt Element\n"); return; } printf ("Bitte Titel eingeben: "); scanf ("%s", ap->titel); printf ("Bitte Autor eingeben: "); scanf ("%s", ap->autor); printf ("Bitte Auflage eingeben: "); scanf ("%d", &ap->auflage); printf ("Bitte ISBN eingeben: "); scanf ("%s", ap->isbn); printf ("Bitte Preis eingeben: "); scanf ("%lf", &ap->preis); } struct fachbuch * insert (struct fachbuch * ap) { /* Aufruf mit aktuellem Pointer ap */ struct fachbuch * newp; /* Platz fuer neues Element besorgen */ if ((newp = (struct fachbuch *)malloc (sizeof (struct fachbuch))) == Null) { printf ("insert: Fehler: malloc missglueckt !\n"); return ap; } if (ap != Null) { /* Zeiger verlinken, zunaechst Verweis uf bisher naechsten weiterschieben */ newp->next = ap->next; /* Neues Element eintragen */ ap->next = newp; /* aktuellen Pointer umsetzen */ ap = ap->next; /* identisch mit ap = newp; */ enter (ap); /* Nutzdaten eingeben lassen */ return ap; } else { /* Sonderfall: Start mit leerer Liste, ap ist Null, newp ist erstes Element */ newp->next = Null; /* Ende der Liste */ ap = newp; /* Ist auch aktuelles Element */ enter (ap); /* Nutzdaten eingeben lassen */ return ap; } } void printelement (struct fachbuch * ap) { /*Werte eines Elements ausgeben */ printf ("---------------------------\n"); printf ("Titel: %s\n", ap->titel); printf ("Autor: %s\n", ap->autor); printf ("Auflage: %d\n", ap->auflage); printf ("ISBN: %s\n", ap->isbn); printf ("Preis: %6.2lf\n", ap->preis); printf ("---------------------------\n\n"); } void printlist (struct fachbuch * fp) { /* Ganze Liste ausgeben, Kette folgen */ while (fp != Null) { /* Ausgabe der Werte eines Elements */ printelement(fp); /* Zeiger weitersetzen */ fp = fp->next; } } void search (struct fachbuch *fp){ char suchwort[256]; /* Suchkriteriumabfragen */ printf("Bitte geben Sie den Suchtext ein: "); scanf("%s", suchwort); /* Bücher suchen */ while (fp != Null){ /* Das Suchwort wird in allen Struct-Elementen gesucht */ if ( strstr(fp->titel , suchwort) || strstr(fp->autor , suchwort) || strstr(fp->isbn , suchwort) || (fp->auflage == atoi(suchwort)) || // Konvertierung String -> int (fp->preis == atof(suchwort)) // Konvertierung String -> float ){ printelement(fp); } /* Zeiger weitersetzen */ fp = fp->next; } } int main() { int menuwahl; struct fachbuch * first = Null; struct fachbuch * akt = Null; struct fachbuch * last = Null; while ((menuwahl = menu()) != 0) { switch (menuwahl) { case 1: /* Anhaengen eines Buches*/ last = insert (last); if (first == Null) first = akt = last; break; case 2: /* Ganze Liste anzeigen */ printlist(first); break; case 3: /* Vorherigen Datensatz anzeigen */ /* todo */ break; case 4: /* Naechsten Datensatz anzeigen */ if (akt->next != Null) akt = akt->next; printelement(akt); break; case 5: /* Ersten Datensatz anzeigen */ akt = first; printelement(akt); break; case 6: /* Einfuegen hinter aktueller Position */ akt = insert (akt); if (first == Null) first = last = akt; break; case 7: /* Datensatz suchen */ search(first); break; case 8: /* aktuellen Datensatz ändern */ /* todo */ break; } } return 0; }
-
ch1ller schrieb:
- wo zum teufel wird die funktion "enter()" deklariert
in zeile 38
ch1ller schrieb:
und warum wird sie obwohl sie nichteinmal aufgerufen wird TROTZDEM im menüpunkt 1 aufgerufen...
was nun? aufgerufen oder nicht?
ch1ller schrieb:
- was soll das
if (first == Null) first = akt = last;
wenn 'first' 0 ist, dann werden 'first' und 'akt' der wert von 'last' zugewiesen.
^^ich finde diese schreibweise übrigens doof, besser:first=last; akt=last;
-
eh ja laso das mit dem "enter" nochmal...
also die frage :wenn enter nichteinmal aufgerufen wurde, warum existiert es dann oben und wird trotzdem verwendet?? -.- wo wird "enter" aufgerufen?
-
Hi,
mal davon abgesehen, dass ich den Quellcode irgend wie gruselig finde. Schau doch mal in der Funktion "struct fachbuch * insert (struct fachbuch * ap)" nach, dort findest Du die Aufrufe von Enter().
Grüße,