Zeiger und Strukturen



  • Hallo,
    ich habe ein Problem mit Zeigern auf structs.
    Übergeben habe ich einen Zeiger auf mein struct, dessen Werte ich 3 Variablen zuordnen möchte, um auf Rechtwinkligkeit zu überprüfen.
    Jetzt beinhalten die 3 Variablen

    int k = x->a;
    int l = x->b;
    int m = x->c;
    

    jedoch nur wahllose zahlen und das obwohl ich ihnen die passenden Werte zugeordnet habe?

    Für Hilfe bin ich dankbar.

    #include <stdio.h>
    
    typedef struct dreieck{
    
    int a;
    int b;
    int c;
    };
    
    double umfang(struct dreieck kl){
    int umfang;
    
    umfang = kl.a + kl.b + kl.c;
    
    return umfang;
    }
    
    int istRechtwinklig(struct dreieck* x){
    //Dereferenzieren und Werte zuordnen __ Hier ist anscheinend mein Problem
    int k = x->a;
    int l = x->b;
    int m = x->c;
    
    if((k*k + l*l) == (m*m)){
        return 1;
    }
    else{
        return 0;
    }
    }
    
    int main (void){
    int i;
    int k;
    struct dreieck eins;
    struct dreieck n;
    
    //struct füllen
    scanf("%d %d %d", &eins.a, &eins.b, &eins.c);
    printf("Die eingegebenen Werte sind: %d und %d und %d \n", eins.a, eins.b, eins.c);
    
    k = umfang(eins);           //Umfang berechnen
    
    i = istRechtwinklig(&n);    //Auf Rechtwinkligkeit überprüfen
    
    printf("Der Umfang des angegebenen Dreieckes beträgt: %d. \n", k);
    
    if(i == 1){
    
        printf("Dreieck ist rechtwinklig. \n");
    }else{
    
        printf("Dreieck ist nicht rechtwinklig. \n");
    }
    }
    


  • Du füllst nur das Dreieck "eins". Da Du "n" also nirgends initialisierst, was soll denn anderes drinstehen als wahllose Zahlen?



  • Doofe Frage, aber müsste in Zeile 45 das '&' nicht entfernt werden? Das ist ja eine normale Wertübergabe oder irre ich mich da?



  • Ich habe

    i = istRechtwinklig(&n);

    durch

    i = istRechtwinklig(&eins);

    ersetzt, jetzt erkennt es immerhin den Inhalt.

    Wenn ich die Deklaration allerdings in die Funktion setze, funktioniert es nicht mehr?
    Obwohl das übergebene struct das selbe ist.. oder sehe ich das falsch?

    double umfang(struct dreieck kl){
    int umfang;
    scanf("%d %d %d", &kl.a, &kl.b, &kl.c);
    printf("Die eingegebenen Werte sind: %d und %d und %d \n", kl.a, kl.b, kl.c);
    umfang = kl.a + kl.b + kl.c;
    
    return umfang;
    }
    

    Und das & muss da stehen, da ich ja einen Zeiger übergebe, also eine Speicheradresse.



  • Was funktioniert denn nicht?
    Btw. Warum benutzt 'umfang' eigentlich auch keinen zeiger? Zeile 24-28 kann auch vereinfacht werden:

    return k*k + l*l == m*m;
    

    Der == Operator gibt bei Gleichheit 1, sonst 0 zurück.
    Über const wirst du sicher später auch was lernen 😉



  • Wenn ich das struct in main deklariere funktioniert es einwandfrei.
    Jedoch, wenn ich es wie in meinem vorherigen post mache, nicht.
    Dann ist der Inhalt des structs in int istRechtwinklig(struct dreieck* x){ wieder wahllos...



  • Kann es sein, dass die Werte für das struct nicht übernommen werden, wenn ich sie in der Funktion deklariere, da sie dementsprechend nur in dieser Funktion gültig sind, selbst wenn ich das struct als Rückgabewert benenne?



  • ouble umfang(struct dreieck kl){...}

    dein kl ist eine Kopie auf dem Stack - da kannst du so viel reinschreiben wie du willst - das wird ausserhalb nicht gesehen

    ouble umfang(struct dreieck***** kl){...}



  • Anonn schrieb:

    double umfang(struct dreieck kl){
    int umfang;
    scanf("%d %d %d", &kl.a, &kl.b, &kl.c);
    printf("Die eingegebenen Werte sind: %d und %d und %d \n", kl.a, kl.b, kl.c);
    umfang = kl.a + kl.b + kl.c;
    
    return umfang;
    }
    

    Hier ist kl eine lokale Variable.
    Alle Änderungen, die du daran vornimmst bleiben in der Funktion.
    Die Variable wird nach Beendigung der Funktion ungültig.

    Es ist sowieso doof, eine Funktion die eine Berechnung durchführt, noch die Benutzerführung (Ein-/Ausgabe) machen zu lassen.



  • Okay, vielen dank, wieder was gelernt. 🙂


Anmelden zum Antworten