Zeiger Problem...



  • Hallo ich habe hier eine Aufgabe: Schreiben Sie eine Funktion
    void pointToMax ( int ** p , int *a , int * b ) ;
    nach deren Aufruf gilt: *p = a, falls a > b, oder *p = b sonst. Lesen Sie im Hauptprogramm a und b mit der
    Funktion scanf von der Konsole ein und rufen Sie die pointToMax auf. Geben Sie anschließend den Inhalt von p
    aus.

    das ganze sieht bei mir jetzt so aus:

    #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, int b, int *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", pointToMax( a, b, p));

    return 0;
    }

    Und jetzt bekomme ich immernoch ziemlich viele Warnungen, von denen ich nicht alle verstehe...
    aufgabe1.c: In function ‘main’:
    aufgabe1.c:21: warning: passing argument 1 of ‘pointToMax’ makes pointer from integer without a cast
    aufgabe1.c:4: note: expected ‘int **’ but argument is of type ‘int’
    aufgabe1.c:21: warning: passing argument 2 of ‘pointToMax’ makes pointer from integer without a cast
    aufgabe1.c:4: note: expected ‘int *’ but argument is of type ‘int’
    aufgabe1.c:21: error: invalid use of void expression

    Brauche dringend Hilfe... 😕
    danke schonmal!! 🕶



  • Wie wird main definiert?
    Da gibt es ganz klare Vorgaben vom Standard.

    Nach dem Aufruf von deiner Funktion soll p auf a oder b zeigen, je nach Inhalt.
    Darum musst du in deiner Funktion auch die Zeiger dereferenzieren und nicht die Adressen vergleichen.



  • Hallo,

    die Aufgabenstellung enthält Fehler, ich nehme stark an, dass der "Funktionskopf" anders aussehen muss, z.B.:

    void pointToMax ( int *p , int a , int b);
    

    oder auch

    void pointToMax ( int *p , int *a , int *b);
    

    Ich nehme den ersten Fall an, weil ich faul bin (dann muss man in der Funktion nur wenig ändern, siehe Kommentar:

    void pointToMax ( int *p, int a, int b) 
    {
    // stimmt nicht mit der Aufgabenstellung überein!
    if(a<b) 
    { 
    *p = a; 
    } 
    else 
    *p = b; 
    // return sieht hier komisch aus, direkt vor Abschluss einer void-Funktion
    }
    
    int main () // es gibt keine Parameter nach Aufgabenstellung, leere Klammern!
    { 
    
    int a;
    int b;
    int 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);
    printf("p ist jetzt %d.\n", p); 
    
    return 0; 
    }
    

    Die Lösung für den zweiten Fall überlasse ich dir 😉

    MfG,

    Probe-Nutzer



  • 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 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?



  • 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;
    }
    

Anmelden zum Antworten