Verständnisproblem bei einfachem struct ...



  • Hi,

    ich bin in der Lernphase, übe z.Z. mit structs und habe folgendes Problem:

    Im folgenden Code, ..

    struct Bruch {
    
           int z;
           //int z2;
           unsigned int n;
           unsigned int n2;
           int gn; 
           unsigned int gz; 
    
    }test;
    void bruch_scan() {
         printf("\nZaehler: ");
         scanf("%d", &test.z);
         printf("\nNenner: ");
         scanf("%u", &test.n);
    }
    void bruch_printf(struct Bruch *zae, struct Bruch *nen) {
         printf("\n%d\n--\n%u\n", *zae, *nen);
    
    }
    int main(void) {
        bruch_scan();
        bruch_printf(&test.z, &test.n);
        getchar();
        return 0;
    }
    

    gibt mir die Funktion 'bruch_print' die Werte der beiden Adressen wieder.
    Wenn ich aber die Variable 'int z2' im struct wieder auskommentiere, wird als wert von &test.n nur 0 ausgegeben.

    Warum ?

    grüsse



  • Jammert da nicht der Compiler?

    23 main.c [Warning] passing arg 1 of `bruch_printf' from incompatible pointer type
    

    Denk mal drüber nach, warum!



  • hans_struct schrieb:

    void bruch_printf(struct Bruch *zae, struct Bruch *nen) {
         printf("\n%d\n--\n%u\n", *zae, *nen);
    
    }
    int main(void) {
        bruch_scan();
        bruch_printf(&test.z, &test.n);
        getchar();
        return 0;
    }
    

    gibt mir die Funktion 'bruch_print' die Werte der beiden Adressen wieder.
    Wenn ich aber die Variable 'int z2' im struct wieder auskommentiere, wird als wert von &test.n nur 0 ausgegeben.

    Warum ?

    Du hast da einen kleinen Denkfehler drin: beim Aufruf von bruch_printf() übergibst du inkompatible Pointer (du übergibst einen Zeiger auf einen int und die Funktion erwartet einen Zeiger auf ein "struct Bruch").
    Du solltest die Signatur von bruch_printf so ändern, dass du einfach nur 2 Integer Werte übergibst (wäre zumindest in diesem Kontext am sinnvollsten).

    }-Tux-{



  • Oh, also die beiden Parameter spiegeln also das komplette Struct wieder ?
    Ich glaube, dann weiss ich, wo der Fehler liegt. Normale int-pointer tun's ja auch... 🙂



  • }-Tux-{ schrieb:

    Du solltest die Signatur von bruch_printf so ändern, dass du einfach nur 2 Integer Werte übergibst (wäre zumindest in diesem Kontext am sinnvollsten).

    unfug, über gibt einen struct-* und bei 'bruch_scan' ebenso.
    🙂



  • Soviel also zu "kompiliert, alles wird gut". Entweder auf die Warnungen hören oder den Compiler strenger machen!
    Problem gelöst?



  • Ja, alles prima.
    Danke für die Antworten euch allen.

    Also Warunung ignoriere ich meist, da ich schon froh bin wenn ich keine error-ausgabe bekomme. 😉

    grüsse


Anmelden zum Antworten