Bon, ca fait que 2 jours que je fais du C# donc soyez indulgents
J’utilise donc une structure pour stocker différentes choses, dont un tableau de structs (d’un autre type de struct bien sûr). Ca donne quelque chose dans ce genre pour la déclaration de la structure (le tout est dans une classe mais je skippe les public/protected):
struct Struct1 {
…
Struct2[ ] tabStruct2;
…
};
Et voilà mon problème :
Dans une structure, on ne peut pas initialiser les différents éléments lors de la déclaration du type. Soit. Donc impossible de dire que tabStruct2 contrient 10 éléments. En plus, comme c’est une struct, bah le constructeur par défaut Struct1() on a pas le droit d’y toucher (pour des raisons d’implémentations du CLR et à cause des satellites qui balancent des microondes qui nous grillent le cerveau, mais passons).
Du coup, j’ai pas trouvé comment dire que mon tableau contient X éléments sans passer par un truc goret à souhait (j’ai honte mais je le dis : définition d’un constructeur Struct1(int a) dans lequel j’initialise mon tableau, et instanciation de la structure par l’appel de ce constructeur inutile : Struct1 maStruct1 = new Struct1(666); ).
J’ai cherché en vain sur MSDN (et ailleurs) comment faire pour éviter cette hérésie, mais je n’ai point trouvé. Certes, je pourrais faire une classe plutôt qu’une structure, mais ca n’empêche que j’aimerais tout de même savoir si c’est faisable proprement avec une structure !
Margh mais non quoi L’heresie c’est de mettre un tableau de struct dans un struct hehe.
Les struct c’est alloue sur la stack, pas sur la heap, c’est passe par valeur en un seul bloc de memoire de taille (presque toujours FIXE). Il est parfaitement normal que si struct2[] tabStruct2 est un pointeur vers un tableau de struct2 alloué sur la heap il puisse pas le faire au moment de l’allocation de struct1
Une struct c’est tout a plat en memoire, si tu veux mettre dix struct2 dans ta struct1, il te faut mettre dix struct2 dans ta struct2.
Les struct de taille variable sont un veritable cauchemard a gerer et doivent etre la plupart du temps alloues a la main en memoire. Ceux qui connaissent LOGPALETTE savent a quel point c’est la merde et c’est MAL sauf si vraiment (comme a l’epoque de win3.1) on a pas le choix pour des raisons de perfs…
Note: d’ailleur si tu mattes win.h LOGPALETTE est traitreusement declare comme
typedef struct tagLOGPALETTE {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE;
qui est une mechante bidouille parceque en fait les PALETEENTRY elles sont mise toutes a plat a la suite dans cette struct de taille variable, mais comme tu vois, meme en C, la declaration se fait pas comme ca.
Je peux te retrouver comment j’ai fait l’interop en C# pour parler a win32 avec une tagLOGPALETTE dans System.Drawing mais c’est pas supra simple
Merci de cette réponse rapide, donc si je comprend bien, les tableaux dans des structs sépabien !
Pourtant si je ne m’abuse, la struct dans le tableau est de taille fixe et connue, et je veux justement donner le nombre d’éléments pour que la taille soit connue (et fixe aussi). Du coup je ne vois pas pourquoi on ne pourrait pas en mettre dans le tableau !
Ah bah si en fait, si je me souviens bien, les tableaux c’est juste un enjoliveur sur une classe ARRAY, du coup ca colle pas… d’ailleurs c’est vrai que même en C un tableau n’est que le pointeur sur son premier élément. Tout s’explique
Mais bon, si pour mettre 10 struct faut mettre 10 fois la même struct et pas un tableau de 10 struct, bah… c’est moins intéressant, je vais faire une classe du coup