Zeiger Problem...
-
Es ist eine Übungsaufgabe. Die sind selten sinnvoll.
Darum wird die Funktionsdeklaration vom TO schon richtig sein.
-
Der Funktionsname impliziert doch schon, dass es um Zeigermanipulation gehen soll, deswegen wird zumindest die Übergabe eines int ** schon richtig sein. Bei den anderen beiden Parametern könnte man tatsächlich anderer Meinung sein.
-
DirkB schrieb:
Wie wird
main
definiert?
Da gibt es ganz klare Vorgaben vom Standard.Das verstehe ich nicht ganz, wie du das meinst...
Habe ich es falsch definiert? Ist das erste mal, das ich Zeiger benutzeUnd zum derefenziere: ich hab das grad noch mal nachgelesen, danach was mein Fehler, dass ich geschrieben hab:
*p = a;
und nicht:
*p = &a;
oder?
-
Hallo,
da habt ihr Recht, nach dem Aufruf soll p auf das Resultat zeigen, sollte also eher ein Zeigertyp (*int p) sein
MfG,
Probe-Nutzer
-
lilalinda06 schrieb:
Habe ich es falsch definiert? Ist das erste mal, das ich Zeiger benutze
Und zum derefenziere: ich hab das grad noch mal nachgelesen, danach was mein Fehler, dass ich geschrieben hab:
*p = a;
und nicht:
*p = &a;
oder?
Ja, das ist nach Standard nicht erlaubt, dein Programm benötigt keine Parameter, also reicht einfach:
int main ()
Zum Dereferenzieren: p soll so aussehen:
void pointToMax ( int ** p , int *a , int * b )
dann sind a und b schon Zeiger, da gäbe es nichts zu dereferenzieren, und es reichte:
*p = a; //*p hat Typ int*, a hat Typ int*
Aber der "Fehler" (auch Warnungen sind mitunter potenzielle Fehlerquellen) liegt doch in Zeile 21:
Dort müssen Zeiger übergeben werden, mit dem &-Operator.
Der Fehler: eine void-Funktion gibt keinen Wert zurück, kann also hier:printf("p ist jetzt %d.\n", pointToMax( a, b, p));
nicht als auszuwertender Ausdruck angegeben werden.
MfG,
Probe-Nutzer
-
So ich hab da jetzt bisschen umgeschrieben und nochmal einiges nachgelesen.
Jetzt bekomme ich keine Fehlermeldungen mehr, aber es kommt am ende was total falsches raus...#include <stdio.h>
#include <math.h>void pointToMax ( int **p, int *a, int *b )
{if( a < b)
{
*p = a;
}
else
*p = b;
return ;
}int main ()
{
int a, b, *p;
printf("Gib zwei Variablen a und b ein.\n");
scanf("%d", &a);
scanf("%d", &b);
printf(" Du hast a=%d und b=%d eingegeben.\n", a, b);
printf("p ist jetzt %d.\n", *p);return 0;
}für a=1 und b=2 kommt dann 1474660693 raus
-
Du rufst die Funktion ja auch gar nicht auf - p ist uninitialisiert
.
Außerdem vergleichst du in pointToMax die Zeiger, nicht das, auf was sie zeigen (Stichwort Dereferenzierung).Planlos im Code rumzupfuschen, ohne das man weiß, was man macht, war noch nie eine sonderlich gute Idee.
-
So, das Ganze mal mit cpp-Tags (Code markieren und den C/C++ Button unter den
anklicken) und dein paar Kommentaren
#include <stdio.h> #include <math.h> void pointToMax ( int **p, int *a, int *b ) { if( a < b) // hier vergleichst du die Zeiger und nicht den Wert auf den sie zeigen *p = a; else *p = b; return ; } int main () // Hier int a, b, *p; printf("Gib zwei Variablen a und b ein.\n"); scanf("%d", &a); scanf("%d", &b); printf(" Du hast a=%d und b=%d eingegeben.\n", a, b); // bis hierher ok printf("p ist jetzt %d.\n", *p); // Wo hast du bis jetzt p verändert? return 0; }
-
Aber wo ist denn jetzt pointToMax geblieben?
Auch eine void-Funktion muss schon, an der richtigen Stelle, aufgerufen werden (siehe meine erste Antwort oben, aber da muss noch etwas geändert werden, siehe unten), es reicht nicht, wenn sie nur oben definiert ist.
Und überlege noch einmal, wie du pointToMax aufrufen musst (wo müssen die &-Operatoren stehen, in welcher Reihenfolge müssen die Argumente übergeben werden...),
und pointToMax enthält noch Fehler (beim Vergleich a < b werden Zeiger verglichen, was hier nicht erwünscht ist, du musst die Werte vergleichen, also hier auch dereferenzieren, wie DirkB schon geschrieben hat)
MfG,
Probe-Nutzer
-
#include <stdio.h> #include <math.h> void pointToMax ( int **p, int *a, int *b ) { if( *a < *b) /* statt a,b muss es hier *a,*b heißen, du willst Werte und nicht Adressen miteinander vergleichen */ { *p = a; } else *p = b; return ; } int main () { int a, b, *p; printf("Gib zwei Variablen a und b ein.\n"); scanf("%d", &a); scanf("%d", &b); printf(" Du hast a=%d und b=%d eingegeben.\n", a, b); pointToMax( &p,&a,&b ); /* die oben mühsam implementierte Funktion solltest du auch aufrufen */ printf("p ist jetzt %d.\n", *p); return 0; }