Zeiger umhängen mit Funktion
-
Hallo liebe C-Programmierer,
ich kann mir nicht erklären, warum mein Testprogrammm ohne Funktion (do_it)
funktioniert, aber mit Funktion nicht. Weiß das jemand?#include "stdio.h" #include "stdlib.h" typedef struct knot { int d_zahl; struct knot * nex; }; void ausg (struct knot * kptr){ int i=1; do { printf(" %d %d \n",i,kptr->d_zahl); if (kptr->nex != NULL) kptr=kptr->nex; else break; i++; } while (1); } void do_it (struct knot * pak,struct knot * anf) { struct knot * hiz; if (pak->d_zahl > anf->d_zahl) { pak->nex = NULL; anf->nex = pak; } else { hiz = pak; pak->nex = anf; anf= hiz; }; }; void main() { struct knot * pkno; struct knot * anfangz; int eing; printf(" Bitte Zahl eingeben; \n"); scanf("%d", &eing); pkno = malloc(sizeof(struct knot)); pkno->d_zahl = eing; pkno->nex = NULL; anfangz=pkno; printf(" Bitte noch eine Zahl eingeben; \n"); scanf("%d", &eing); pkno = malloc(sizeof(struct knot)); pkno->d_zahl = eing; do_it(pkno,anfangz); ausg(anfangz); }
ohne Funktion do_it
#include "stdio.h" #include "stdlib.h" typedef struct knot { int d_zahl; struct knot * nex; }; void ausg(struct knot * kptr){ int i=1; do { printf(" %d %d \n",i,kptr->d_zahl); if (kptr->nex != 0) kptr=kptr->nex; else break; i++; }while (1); } int main() { struct knot * pkno; struct knot * anfangz; struct knot * hz; int eing; printf(" Bitte Zahl eingeben \n"); scanf("%d", &eing); pkno = malloc(sizeof(struct knot)); pkno->d_zahl = eing; pkno->nex = NULL; anfangz=pkno; printf(" Bitte noch eine Zahl eingeben \n"); scanf("%d", &eing); pkno = malloc(sizeof(struct knot)); pkno->d_zahl = eing; if (pkno->d_zahl > anfangz->d_zahl) { pkno->nex = NULL; anfangz->nex = pkno;} else { hz=pkno; pkno->nex = anfangz; anfangz= hz; }; ausg(anfangz); }
-
Was macht anf= hiz; in der Funktion do_it ?
Bedenke, dass du innerhalb der Funktion nur lokale Variablen hast.
-
Hallo Dirk8,
danke für Dein Interesse.
Der Hilfszeiger hz wird in dem Programm ohne die Funktion do_it gar nicht gebraucht, es funkktioniert auch wenn ich im else-zweig nur
pkno->nex = anfangz; anfangz= pkno;
schreibe.
Ich kann "hiz" auch im Prg. mit Fkt do_it weglassen, ohne dass sich was ändert.Ich habe auch daran gedacht, dass es mit lokalen Variablen zu tun hat und es gibt auch "gewisse" Hinweise darauf (Ausgabe der Werte von "anf" in do_it, dort hat anf den richtigen Wert, aber diese wird nicht an "anfangz" zurückgegeben bzw. anfangz wird nicht verändert.
(es geht wohl nur um den else-Zweig in do_it)
-
DirkB meinte nicht den Hilfszeiger, sondern die Variable 'anf'.
Wenn du diese ändern möchtest, so daß auch die übergebene Variable sich ändert, dann verwende einen Doppelzeiger:void do_it (struct knot * pak, struct knot ** anf) { // ... *anf = hiz; }
Aufruf:
do_it(pkno, &anfangz);
-
Hallo Th69,
toll, vielen herzlichen Dank, es funktioniert.
In welchem Lehrbuch steht sowas bzw. wie lernt man sowas?
-
gast456 schrieb:
In welchem Lehrbuch steht sowas bzw. wie lernt man sowas?
Das sollte in jedem Lehrbuch erklärt werden. Eventuell, wenn sich das Buch sehr kurz fasst, bringt es möglicherweise kein explizites Beispiel mit den Doppelzeigern. Das ist dann selbst zu erbringende Transferleistung, aus dem Wissen über Zeiger und Funktionsparameter (welche beide im Buch garantiert erklärt werden).
-
...die selbst sogar noch eine eigene Adresse haben ...
In dem gar nicht dünnen, eher dicken Buch, das ich momentan verwende, werden Doppelzeiger nicht angesprochen (Zeiger allgemein und Funktionsparameter selbstverständlich schon).
Das ist schon sehr richtig mit der eigenen Transferleistung bzw. Kreativleistung, das ist ja das, was beim Lösen von nicht-trivialen Problemen gebraucht wird.
Ich habe erstmal dieses Forum vorgezogen; was wäre wohl geworden, wenn es dieses Forum nicht gäbe?Vielen Dank nochmal!
-
gast456 schrieb:
Ich habe erstmal dieses Forum vorgezogen; was wäre wohl geworden, wenn es dieses Forum nicht gäbe?
Das wäre dann wohl ein frühes, frustriertes Ende deiner Programmiererkarriere gewesen
Aber deswegen gibt es ja solche Foren