[gelöst]Struct-Array an Funktion weitergeben



  • Ich habe eine Frage, bei der ich mit meinem - noch recht geringen - Verständnis von C nicht mehr weiterkomme.

    Ich habe ein struct-Array angelegt, da ich eine variable Anzahl an structs fülle:

    struct album sammlung[200]
    

    Dieses möchte ich nun in einer Funktion verändern, sprich, ich übergebe diese Menge an structs "by reference" an diese Funktion weiter.

    Meine Frage ist nun: Wie mache ich das? Muss ich die Funktion mit

    function(int bla, &sammlung)
    

    aufrufen?
    Oder ohne Adressoperator?
    Mein Verständnisproblem liegt darin, dass der Name eines Arrays ja bereits ein Pointer auf das erste Element dieses Arrays ist.
    Wenn ich aber einfach mit

    function(int bla,sammlung)
    

    die Funktion

    void aendern( int id, struct album * sammlung) {etc. pp}
    

    aufrufe, werden die Original-Structs leider nicht geändert, das heißt, es bleibt ein call by value.

    Kann ich überhaupt ein Struct-Array an eine Funktion weitergeben?
    Oder darf man so etwas gar nicht erst erstellen?

    Ich bin im Moment leider, was das angeht, komplett verwirrt.
    Hab wohl zuviel drüber nachgedacht 😃

    Ich bin über's Wochenende leider nicht da, kann also nicht sofort Feedback geben und mich für hoffentlich vorhandene Antworten bedanken, wollte aber - solange ich weiß, wo bei meinem Programm der Wurm steckt 😉 - schon mal mein Problem in die Welt posaunen.

    Danke für eventuelle Bemühungen!



  • Molinman schrieb:

    Dieses möchte ich nun in einer Funktion verändern, sprich, ich übergebe diese Menge an structs "by reference" an diese Funktion weiter.

    "Call by reference" gibt es in C nicht.

    Molinman schrieb:

    Oder ohne Adressoperator?

    Ja, ohne Adressoperator.

    Molinman schrieb:

    Wenn ich aber einfach mit

    function(int bla,sammlung)
    

    die Funktion

    void aendern( int id, struct album * sammlung) {etc. pp}
    

    aufrufe, werden die Original-Structs leider nicht geändert, das heißt, es bleibt ein call by value.

    Dann machst du wohl in der Fkt. was falsch. Ich hab dir mal ein kleines Komplettbeispiel wie man das richtig macht:

    #include <stdio.h>
    
    struct foo{
            int a;
            float f;
    };
    
    void bar (struct foo *ptr, size_t n);
    
    int main (void){
            struct foo arr[2];
            int i;
    
            // Ausgabe uninitialisiert
            for (i=0; i < sizeof(arr)/sizeof(*arr) ;++i){    // sizeof(arr)/sizeof(*arr) liefert Anzahl der Elemente von arr
                    printf("-> %d, %f\n", arr[i].a, arr[i].f);
            }
    
            bar (arr, sizeof(arr)/sizeof(*arr));
    
            // Ausgabe initialisier
            for (i=0; i < sizeof(arr)/sizeof(*arr) ;++i ){
                    printf("-> %d, %f\n", arr[i].a, arr[i].f);
            }
    
            return 0;
    }
    
    void bar (struct foo *ptr, size_t n){
            int i;
            for( i=0; i<n; ++i){
                    ptr[i].a = 1;
                    ptr[i].f = 3.14;
            }
    }
    

    Einfach mal kompilieren und testen.



  • Eigentlich sollte das schon funktionieren:

    #include <stdio.h>
    
    typedef struct {
      int bar;
    } Foo;
    
    void setValue(Foo *x, unsigned index, int value) {
      x[index].bar = value;
    }
    
    int main(int argc, char **argv) {
      Foo x[5];
    
      setValue(x, 0, -874);
    
      printf("%d\n", x[0].bar);
    
      return 0;
    }
    

    Kann ich überhaupt ein Struct-Array an eine Funktion weitergeben?

    Ja.

    Oder darf man so etwas gar nicht erst erstellen?

    Doch.

    EDIT: Eha, bin ich lahm 😞
    MfG

    GPC



  • Danke für die Antworten!

    Also bei den Adressoperatoren etc. hab ich anscheinend dann alles richtig gemacht, der Fehler muss also tatsächlich in der Funktion selbst liegen - das tut er auch 😉

    Ich möchte eine Eingabe in ein bestimmtes Struct-Array kopieren.

    Müsste das dann nicht heißen:

    strcpy(sammlung[2]->interpret,eingabe);
    

    Bzw. natürlich muss es nicht so heißen, GCC erklärt mir:

    funktionen.c:37: Fehler: falsches Typ-Argument von »->«
    

    'interpret' ist natürlich ein char-Array.

    Ich hab ehrlich gesucht, aber nichts gefunden.
    Könnte man mir nochmal helfen? Danke 🙂



  • Hallo,

    nein, es muss

    strcpy(sammlung[2].interpret,eingabe);
    

    heißen, vorausgesetzt sammlung ist ein Array vom Typ Album und eingabe ist auch eine Zeichenkette 🙂

    MfG

    GPC



  • AAAAAAAAAAAAAAAAAARGGGGHHHHHHHHHHHHHHHHHHH!!!!!

    Meine Anfangsversion hatte gestimmt, ich hab nur z.B. bei

    strcpy(sammlung[VARIABLE].interpret,eingabe);
    

    die falsche VARIABLE eingesetzt 😃
    Damit hab ich zwar astrein den Inhalt und alles geändert, aber leider an der falschen Stelle...

    Danke auf jeden Fall! ^^


Anmelden zum Antworten