2010-11-09 9 views
1

J'ai un tableau statique const tridimensionnel qui agit comme une table de recherche. Chaque cellule du tableau peut renvoyer jusqu'à 8 nombres distincts (chaque nombre est le coin d'un cube - un voxel pour être exact). Ainsi, par exemple, MyStaticArray[0][1][1] pourrait renvoyer 1,2,5,7. Il peut retourner un nombre unique ou un maximum de huit nombres, comme ceci: 1,2,3,4,5,6,7,8.Initialisation d'un tableau const statique tridimensionnel

J'ai déjà la table de consultation préparée (sur papier), ma question est quelle est la meilleure façon de le stocker? Initialement, j'allais avec un static const unsigned char[][][] mais cela ne va évidemment pas fonctionner dans ce cas car la table peut retourner plus d'un nombre (encore une fois, de 1-8).

Ma solution suivante consistait à retourner un tableau char non signé. Autrement dit, statique const unsigned char * [] [] []. Comment est-ce que j'initialise ceci (c'est-à-dire comment initialiser le tableau statique de const pour retourner à moi des tableaux de char non signés qui sont également statiques pour que je puisse y accéder sans initialiser une classe)? Y a-t-il un meilleur moyen?

J'espère que j'ai été en mesure d'expliquer la question correctement. Si non, faites le moi savoir et je vais essayer de le reformuler et/ou fournir des informations supplémentaires.

Répondre

3

Vous pad pourrait chaque élément jusqu'à la longueur maximale avec des éléments fictifs, et aller avec un tableau 4D:

static const unsigned char x[M][N][P][8] = { { 1, 2, 5, 7, -1, -1, -1, -1 }, 
              { 1, 2, 3, 4, 5, 6, 7, 8 }, 
              ... 

ou vous pouvez utiliser des bits individuels comme des drapeaux, par exemple:

static const unsigned char x[M][N][P] = { 0x53, // Bits 0, 1, 4, 6 are set 
              0xFF, 
              ... 

Si vous avez besoin de plus de 8 possibilités, passez à uint16_t ou uint32_t.

La méthode que vous utilisez dépend de ce que vous avez l'intention de faire avec les données.

1

Comme vous revenez seulement 0-8 sur 8 numéros possibles, je pense que vous devriez en tenir à static const unsigned char[][][] et stocker les « numéros » comme un octet bitfield où le bit n est défini si n est l'un des numéros utilisés pour cette cellule, donc fe 1,2,5,7 peut être codé comme 01010011 binaire ou 0x53 hexadécimal.

1

Pour utiliser l'initialisation statique, vous devez connaître chaque dimension de votre baie. Je suppose que vous le savez déjà mais que vous ne l'avez pas mentionné dans votre question, j'utiliserai donc les dimensions [2] [2] [2] pour mes exemples.

Vous aurez également besoin d'un moyen de déterminer le nombre d'éléments à chaque position dans le tableau. Vous pouvez définir le nombre d'éléments comme première valeur de la liste ou créer une valeur sentinelle pour marquer la fin de la liste.

Pour remplir chaque liste de 8 éléments, cela ressemble à ceci. Toute valeur non initialisée dans le tableau sera mise à 0.

static const unsigned char array[2][2][2][8] = {{{{1,2,3,4,5},{1,2,3,4,5,6,7,8}},{{4},{5}}},{{{...}}}}; 
Questions connexes