Probleme mit dem kopieren von mehrdimensionalen Arrays



  • Hallo,

    nach langen erfolglosen suchorgien, habe ich mich nun doch dazu durchgerungen mal nachzufragen.

    Ich versuche ein Array mit zwei Dimensionen und einer größe von 30 x 30
    Feldern zu kopieren.

    Verschiedene Versuche führten aber nicht zu dem richtigen Ergebnis. :

    1. Versuch:

    memcpy( original, kopie, sizeof( original )) ;
    
    printf ("%2d - %2d", original[3][5], kopie[3][5]) ;
    

    Ausgabe durch printf : 7 - 0

    2. Versuch:

    unsigned char kopie [50] [50] ;
        unsigned char Size1 ;
        unsigned int b ;
        unsigned int c ;
        Size1 = sizeof(original[0]);
    
        for(b = 0; b < Size1; ++b) 
        { 
           for(c = 0; c < Size1; ++c) 
                   kopie[b][c] =  original[b][c] ; 
        }
    
    printf ("%2 - %2d - %2d", Size1, original[3][5], kopie[3][5]) ;
    

    Ausgabe durch printf : 30 - 7 - 0

    wenn ich statt original[b][c] einfach eine zahl angebe, ist mein
    kopie - Array mit der richtigen Zahl gefüllt.

    Ich verstehe einfach nicht, was ich da falsch mache 😞

    Danke schonmal

    Webdiego



  • Zeig doch mal dazu, wie (und wo) 'original' definiert wurde (und beim ersten Beispiel auch, wie 'kopie' aussieht).



  • Also: sizeof(original) gibt dir die Größe des pointers zurück, denn original ist ein Zeiger.

    Besser (und leichter zu warten) ist etwas wie:

    #define COLCOUNT 30
    #define ROWCOUNT 30
    #define TABLETYP int
    

    Damit vermeidest du schonmal, daß du mehrere Stellen ändern muss, wenn du die Anzahl der Werte veränderst.

    TABLETYP original[COLCOUNT][ROWCOUNT];
    TABLETYP kopie[COLCOUNT][ROWCOUNT];
    

    Hier verwendest du die oben deklarierten defines, um deine "Tabelle" anzulegen.

    memcpy(kopie, original, sizeof(TABLETYP) * ROWCOUNT * COLCOUNT);
    

    Hiermit kopierst du dann "original" in "kopie".

    Dein Hauptproblem: "kopie" und "original" sind Zeiger. sizeof(zeiger) ist die Größe des Zeigers, nicht des dahinterliegenden Werts.

    Auch "original[0]" ist wieder ein Zeiger, und verursacht das gleiche Problem: Es kommt vermutlich "4" heraus (32-Bit-System, 4 Byte). Du kopierst also maximal 4 (1 Version) bzw 16 (zweite Version) Werte, und zwar nie solche, das [3][5] gefüllt wäre.



  • Sid2K7 schrieb:

    Besser (und leichter zu warten) ist etwas wie:

    #define COLCOUNT 30
    #define ROWCOUNT 30
    #define TABLETYP int
    

    Wobei das letzte besser typedef int TABLETYPE; lauten sollte.



  • 🤡 Ups ...

    Habe meinen Fehler gefunden ...

    die printf Anweisung stand in meinem Code etwas weiter unten...
    dort war das Original dann auch mit werten gefüllt ...

    Sorry und danke, an alle die sich mühe gemacht haben.

    webdiego


Anmelden zum Antworten