Struct an ausgelagerte Funktion übergeben



  • Hallo Forum,

    ich versuche momentan das ich ein Struct mit mehren Variablen als Inhalt an eine ausgelagerte Funktion übergeben will. In der Funktion will ich dann mit den Variablen rechnen und einige Werte (als Ergebnis) verändern.

    Der zweite Teil ist ja eine klassische Pointer-Anweisung. Was nun aber mein Problem ist, ich habe keine Ahnung wie ich es hin bekomme das die ausgelagerte Funktion die Variablen aus der ursprünglichen Deklaration benutzt werden...

    Ich hab das ganze mal auf ein sehr einfaches Beispiel runter gebrochen und hoffe ihr könnt mit helfen.

    main.c:

    #include <stdio.h>
    
    struct liste
    {
        int a = 5;
        int b = 10;
        int c = 0;
    } var;
    
    int main()
    {
        fct(&var);
        printf("C = %d", var.c);
    
        return 0;
    }
    

    fct.c:

    extern struct liste
    {
        extern int a;
        extern int b;
        extern int c;
    } var;
    
    fct(struct liste *var)
    {
        *var.c = var.a + var.b;
    }
    

    Zum Problem:

    error: request for member 'c'/'a'/'b' in something not a structure or union

    Danke für eure Hilfe im Voraus.
    - NewOnC



  • Du hast einige grundsätzliche Fehler:

    struct liste
    {
        int a = 5;
        int b = 10;
        int c = 0;
    }
    

    Du kannst die Member einer struct so nicht initialisieren.

    extern struct liste
    {
        extern int a;
        extern int b;
        extern int c;
    } var;
    

    Das extern hier ist Blödsinn. Was soll das denn bedeuten ? Extern bedeutet, dass eine Variable zwar bekannt ist, aber woanders definiert ist. Zum Beispiel in einem anderen Sourcefile. Es hat also keinen Sinn den Member einer struct extern zu machen.

    *var.c = var.a + var.b;
    

    Du hast einen Pointer. Dh du hast zwei Möglichkeiten auf die Member zuzugreifen:

    var->a
    (*var).a
    

    Mach es so:

    //main.c
    #include <stdio.h>
    struct liste
    {
        int a;
        int b;
        int c;
    };
    
    void fct(struct liste *var);
    
    int main()
    {
        struct liste var;
        var.a = 5;
        var.b = 10;
        var.c = 0;
        fct(&var);
        printf("C = %d", var.c);
        return 0;
    }
    
    //fct.c
    struct liste
    {
        int a;
        int b;
        int c;
    };
    
    void fct(struct liste *var)
    {
        var->c = var->a + var->b;
    }
    


  • DarkShadow44 schrieb:

    Mach es so:

    //main.c
    #include <stdio.h>
    struct liste
    {
        int a;
        int b;
        int c;
    };
    
    void fct(struct liste *var);
    
    int main()
    {
        struct liste var;
        var.a = 5;
        var.b = 10;
        var.c = 0;
        fct(&var);
        printf("C = %d", var.c);
        return 0;
    }
    
    //fct.c
    struct liste
    {
        int a;
        int b;
        int c;
    };
    
    void fct(struct liste *var)
    {
        var->c = var->a + var->b;
    }
    

    Nicht gut! So musst du die struct liste in beiden Files immer parallel ändern, der Compiler merkt nicht, wenn sie nicht übereinstimmen. Die Definition von struct liste (und die Deklaration von fct) gehören unbedingt in ein Header-File, was von beiden c-Files eingebunden wird.



  • struct Variablen kommen häufig vor, es ist auch möglich, dabei ohne Zeiger auszukommen, indem du den Returnwert deiner Funktion für eine struct-Kopie nutzt;
    das hat den Vorteil, dass deine Input-struct-Variable unverändert bleibt, z.B.

    typedef struct { int a,b,c; } Liste;
    
    Liste fct(Liste input)
    {
      ...
      return input;
    }
    
    int main()
    {
        Liste input={5,10,0},output;
        output = fct(input);
        printf("C = %d", output.c); 
        return 0;
    }
    


  • Vielen Dank DarkShadow44, jetzt funktioniert es.

    @Bashar, ich habe die Struct-Deklaration auch in einen Header ausgelagert.

    @Wutz, Danke für den Hinweis.

    -NewOnC


Anmelden zum Antworten