2016-08-23 3 views
0

j'ai défini un tableau comme celui-ci:Comment copier un tableau

uint8_t brightnessvariants[4][101]={{1,2,...},{3,4,...},{5,6,...},{7,8,...}}; 

Maintenant pour mon application, je dois remplir un autre tableau avec l'un des 4 tableaux:

uint8_t brightnesstable[] = brightnessvariants[index][]; 

Mais ce doesn ne fonctionne pas. Index est compté de 0 à 3.

brightnesstable et brightnessvariants sont définis dans un fichier d'en-tête comme extern

Comment puis-je faire droit?

+0

Pourquoi voudriez-vous faire cela? – EOF

+0

utilisez simplement une boucle pour accéder au contenu du sous-tableau et copiez chaque valeur dans le nouveau tableau. –

+2

@johnelemans: Quel est le problème avec 'memcpy'? – Olaf

Répondre

1

Il suffit de faire

uint8_t brightnesstable[101]; 
memcpy(brightnessstable, brightnessvariants[index], 101*sizeof(uint8_t)); 

brightnessvariants[index] est l'adresse du premier élément de la ligne (index+1)nth et le nombre d'octets que vous souhaitez copier est ROWSIZE*sizeof(ITEM_SIZE).

+0

Suggérer 'memcpy (brightnessstable, brightnessvariants [index], sizeof brightnesstable); ' – chux

1

Cela dépend vraiment de ce que vous devez faire. Si vous devez créer un stockage séparé pour une duplication de l'une des lignes brightnessvariants, vous pouvez simplement déclarer un tableau séparé et copier les valeurs comme indiqué dans les commentaires et l'autre réponse.

Si, toutefois, vous devez simplement accéder à l'une des lignes brightnessvariants dans la portée actuelle, il n'est pas nécessaire de stocker et de copier séparément. Tout ce qui est requis est de déclarer un pointeur et d'assigner l'adresse de départ de la ligne désirée. Ensuite, vous pouvez accéder à la ligne souhaitée de brightnessvariants comme s'il s'agissait d'un tableau séparé. par exemple.

uint8_t brightnessvariants[4][101] = {{0}}, *btable = NULL; 

Au-dessus, btable (abréviation de votre brightnesstable) est tout simplement un pointeur uint8_t. Il peut être affecté l'adresse de l'une des lignes brightnessvariants. par exemple. pour la deuxième rangée

btable = brightnessvariants[1]; 

btable peut ensuite être utilisé pour accéder à une valeur quelconque à l'intérieur de la deuxième rangée, comme si elle était une matrice séparée. Voici un court exemple qui peut aider:

#include <stdio.h> 
#include <stdint.h> 

int main (void) { 

    uint8_t brightnessvariants[4][101] = {{0}}, *btable = NULL; 
    int nrows = sizeof brightnessvariants/sizeof *brightnessvariants; 

    for (int i = 0; i < 101; i++) { 
     brightnessvariants[0][i] = i + 1; 
     brightnessvariants[1][i] = i + 3; 
     brightnessvariants[2][i] = i + 5; 
     brightnessvariants[3][i] = i + 7; 
    } 

    for (int i = 0; i < nrows; i++) { 
     printf ("\nbrightnesstable[%d] :\n\n", i); 
     btable = brightnessvariants[i]; 
     for (int j = 0; j < 101; j++) { 
      if (j && j % 10 == 0) putchar ('\n'); 
      printf (" %3hhu", btable[j]); 
     } 
     putchar ('\n'); 
    } 

    return 0; 
} 

Exemple d'utilisation/sortie

$ ./bin/ptrtobtable 

brightnesstable[0] : 

    1 2 3 4 5 6 7 8 9 10 
    11 12 13 14 15 16 17 18 19 20 
    21 22 23 24 25 26 27 28 29 30 
    31 32 33 34 35 36 37 38 39 40 
    41 42 43 44 45 46 47 48 49 50 
    51 52 53 54 55 56 57 58 59 60 
    61 62 63 64 65 66 67 68 69 70 
    71 72 73 74 75 76 77 78 79 80 
    81 82 83 84 85 86 87 88 89 90 
    91 92 93 94 95 96 97 98 99 100 
101 

brightnesstable[1] : 

    3 4 5 6 7 8 9 10 11 12 
    13 14 15 16 17 18 19 20 21 22 
    23 24 25 26 27 28 29 30 31 32 
    33 34 35 36 37 38 39 40 41 42 
    43 44 45 46 47 48 49 50 51 52 
    53 54 55 56 57 58 59 60 61 62 
    63 64 65 66 67 68 69 70 71 72 
    73 74 75 76 77 78 79 80 81 82 
    83 84 85 86 87 88 89 90 91 92 
    93 94 95 96 97 98 99 100 101 102 
103 

brightnesstable[2] : 

    5 6 7 8 9 10 11 12 13 14 
    15 16 17 18 19 20 21 22 23 24 
    25 26 27 28 29 30 31 32 33 34 
    35 36 37 38 39 40 41 42 43 44 
    45 46 47 48 49 50 51 52 53 54 
    55 56 57 58 59 60 61 62 63 64 
    65 66 67 68 69 70 71 72 73 74 
    75 76 77 78 79 80 81 82 83 84 
    85 86 87 88 89 90 91 92 93 94 
    95 96 97 98 99 100 101 102 103 104 
105 

brightnesstable[3] : 

    7 8 9 10 11 12 13 14 15 16 
    17 18 19 20 21 22 23 24 25 26 
    27 28 29 30 31 32 33 34 35 36 
    37 38 39 40 41 42 43 44 45 46 
    47 48 49 50 51 52 53 54 55 56 
    57 58 59 60 61 62 63 64 65 66 
    67 68 69 70 71 72 73 74 75 76 
    77 78 79 80 81 82 83 84 85 86 
    87 88 89 90 91 92 93 94 95 96 
    97 98 99 100 101 102 103 104 105 106 
107 

choses regarder par-dessus et laissez-moi savoir si vous avez des questions. Si vous avez besoin d'un exemple de copie au lieu de l'utilisation d'un pointeur, faites le moi savoir et je suis heureux de vous aider.