[C] Définir une structure avec un tableau à taille variable

Bonjour,

je voudrais déclarer en ANSI C un tableau avec un sous tableau de longueur variable, pour être précis faire un truc comme ça:

[code]char f1( char x ) { return x+1; }
char f2( char x ) { return x+2; }
char f3( char x ) { return x+3; }

typedef char(*PF)(char);

typedef struct {
unsigned char length;
char value[];
} type1;

typedef struct {
unsigned char length;
PF value[2];
} type2;

typedef struct {
unsigned char length;
PF value[];
} type3;

const type1 type1List[]= {
{ 2, “AA” },
{ 3, “BBB” },
};

const type2 type2List[]= {
{ 2, { f1, f2 } },
{ 2, { f1, f3 } },
};

const type3 type3List[]= {
{ 2, { f1, f2 } },
{ 3, { f1, f2, f3 } },
};

int main() {
return 0;
}[/code]

Autant je peux déclarer avec un tableau de char, autant avec un tableau de pointeur de fonction, ça marche pas. Les type1 et type2, c’est pour vous montrer que ça marche avec un tableau de char et que ça marche avec un tableau de pointeurs de fonctions de taille fixe.
Mais je me fais jeter lors de la déclaration de type3List.
Je précise que je ne peux pas utiliser malloc, c’est pour de l’embarqué, il faut que ce tableau soit en ROM et non en RAM.

Aujourd’hui ce qui marche c’est ça, mais ça me satisfait pas complètement:

[code]char f1( char x ) { return x+1; }
char f2( char x ) { return x+2; }
char f3( char x ) { return x+3; }

typedef char(*PF)(char);

typedef struct {
unsigned char length;
PF* value;
} type3;

const PF funcList1[]={ f1, f2 };
const PF funcList2[]={ f1, f2, f3 };

const type3 type3List[] = {
{ 2, (PF*)funcList1 },
{ 3, (PF*)funcList2 },
};

int main() {
return 0;
}[/code]

En gros je suis obligé de créer des constantes intermédiaires.

Voilà, quelqu’un a-t-il compris ce que je demande? Une idée de comment déclarer ce tableau?
Duffy

En fait si je compile ton truc avec VC2003, je chope ça:

Ce qui me fait dire qu’il n’est pas possible de faire des tableaux de types de taille variable, et ça me semble tout à fait normal. Donc ouais, va falloir passer par la case valeurs intermédiaires, ou bien trouver une autre façon d’organiser tes données.

Je peux développer un peu si je ne suis pas clair, dis-moi quoi.

et une liste chainée ?

[quote=“Drealmer, post:2, topic: 31147”]En fait si je compile ton truc avec VC2003, je chope ça:

Je peux développer un peu si je ne suis pas clair, dis-moi quoi.[/quote]
Ah? Tiens c’est bizarre ça, moi je compile avec gcc avec l’option -Wall -ansi et j’ai pas d’erreur pour type1List et type2List, mais pour type3List. Mais oui je me doute bien que je fait des trucs limites…

Non ça je peux pas, je veux un truc const en ROM et une liste chainée impose une gestion dynamique en RAM, mais oui dans un cas normal j’aurais comma ça.

Bon sinon je pense que je vais rester avec les listes intermédiaires, en plus je viens de me rendre compte que je pouvais remplacer dans le:

const type3 type3List[] = { { 2, (PF*)funcList1 }, { 3, (PF*)funcList2 }, };
les 2 et 3 par des sizeof(funcList1)/sizeof(PF); ce qui m’évitera d’oublier de changer cette valeur si je change funcList1…
Duffy

[quote=“Duffy, post:1, topic: 31147”]Bonjour,

je voudrais déclarer en ANSI C un tableau avec un sous tableau de longueur variable, pour être précis faire un truc comme ça:

[code]char f1( char x ) { return x+1; }
char f2( char x ) { return x+2; }
char f3( char x ) { return x+3; }

typedef char(*PF)(char);

typedef struct {
unsigned char length;
char value[];
} type1;

typedef struct {
unsigned char length;
PF value[2];
} type2;

typedef struct {
unsigned char length;
PF value[];
} type3;

const type1 type1List[]= {
{ 2, “AA” },
{ 3, “BBB” },
};

const type2 type2List[]= {
{ 2, { f1, f2 } },
{ 2, { f1, f3 } },
};

const type3 type3List[]= {
{ 2, { f1, f2 } },
{ 3, { f1, f2, f3 } },
};

int main() {
return 0;
}[/code]

Autant je peux déclarer avec un tableau de char, autant avec un tableau de pointeur de fonction, ça marche pas. Les type1 et type2, c’est pour vous montrer que ça marche avec un tableau de char et que ça marche avec un tableau de pointeurs de fonctions de taille fixe.
Mais je me fais jeter lors de la déclaration de type3List.[/quote]

Par contre, cette ligne la ne pose pas de problème :

Ce qui pose problème avec la declaration de type3List, c’est que tu as un tableau d’elements qui peuvent etre chacuns de taille differentes (et c’est le cas dans ton exemple), donc meme si c’était accepté à la compilation, ca ne fonctionnerai pas bien ensuite pour acceder aux elements du tableau (enfin, theoriquement gcc pourrait gérer le truc pour que ca fonctionne, mais ca compliquerait enormement pour pas grand chose en fait). Bon, d’ailleurs c’est le cas aussi pour type1List, et c’est étrange que gcc accèpte ca, peu etre que ca fonctionne (j’ai pas tésté, mais ca m’étonnerai un peu) ou peu etre que c’est un bug du au fait qu’il ne detecte pas le “AA” comme un {‘A’, ‘A’, ‘\0’} et donc ne voit pas le truc.

Une solution pourrait etre d’avoir un tableau de pointeurs vers des elements type3. Mais c’est moins pratique à écrire …