OVH Cloud OVH Cloud

initialisation de structures

8 réponses
Avatar
Jean Dutour
Bonjour,

J'ai défini des structures (ci-dessous un exemple) :
- "str" défini une chaîne de caractères
- "type" contient un entier et un tableau de str

struct str {
int l;
char *s;
};

struct type {
int i;
struct str s[]; <-- problème
};


int main()
{
struct type t = {
i: 1,
s: {
{4, "plop"}
}
};

printf("%d %d %s\n", t.i, t.s->l, t.s->s);
}


Mais le compilateur "râle" parce qu'il n'a pas la taille du tableau :
$ gcc -g test.c
test.c:8: array size missing in `s'

Mais si je déclare :

struct type {
int i;
struct str *s; <-- encore problème
};

L'initialisation ne marche plus (ce que je comprends bien puisque
{4, "plop"} n'est pas une adresse pour struct str *s.

Y-a-t-il une solution à mon problème ?
J''ai plusieurs types, et tous n'ont pas le même nombre de "struct str"
... mais je souhaite pouvoir faire mes initialisations à la main comme
dans le main ci-dessus.

Merci.

8 réponses

Avatar
Anthony
Bonjour,



Salut,

[...]
struct type {
int i;
struct str s[]; <-- problème
};


[...]

struct type t = {
i: 1,
s: {
{4, "plop"}
}


[...]

Mais le compilateur "râle" parce qu'il n'a pas la taille du tableau :
$ gcc -g test.c
test.c:8: array size missing in `s'


En effet il a raison de râler, il a besoin de connaitre la taille du type
"type" pour s'en sortir.

Mais si je déclare :

struct type {
int i;
struct str *s; <-- encore problème
};


Et là il la connait en effet...



L'initialisation ne marche plus (ce que je comprends bien puisque
{4, "plop"} n'est pas une adresse pour struct str *s.

Y-a-t-il une solution à mon problème ?


Franchement je n'en vois pas.
En fait, tu as besoin d'un tableau de taille variable, et en C, à part faire
ca avec un pointeur et du malloc() je ne vois pas.
Et qui dit malloc dit aussi ne pas pouvoir l'initialiser comme tu le fais.

J''ai plusieurs types, et tous n'ont pas le même nombre de "struct str"
... mais je souhaite pouvoir faire mes initialisations à la main comme
dans le main ci-dessus.


Une solution que je vois est de garder ton pointeur, et de passer par un
tableau intermédiaire :

void mafonction(void) {
struct str tab[] = { {4, "plop"},{5,"pwet"} } ;
struct type = { 2, tab };
/* ... traitement qui va bien */
}

A part ca je ne vois pas, mais il faut le temps que je remette mon cerveau
en marche donc un autre contributeur trouvera sûrement mieux...

--
Anthony

Avatar
Cyrille \cns\ Szymanski
struct str tab[] = { {4, "plop"},{5,"pwet"} } ;



les char *chaine = "coucou"; ça va 5 minutes...

--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/


Avatar
Jean Dutour
In article , Cyrille "cns" Szymanski wrote:
struct str tab[] = { {4, "plop"},{5,"pwet"} } ;



les char *chaine = "coucou"; ça va 5 minutes...



Constructif comme réponse ...



Avatar
Cyrille \cns\ Szymanski
struct str tab[] = { {4, "plop"},{5,"pwet"} } ;



les char *chaine = "coucou"; ça va 5 minutes...



Constructif comme réponse ...


C'est juste une remarque et je ne veux pas m'avancer à tort pour critiquer
son utilisation ici.

Pour tout ce qui n'est pas message statique (genre message d'erreur)
l'inconvénient de cette méthode est qu'on est tenté d'appeler des fonctions
dessus (ex. strtok) et on pleure à cause d'une "segmentation fault".

Mais si tu sais ce que tu fais ignore mon message.

--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/




Avatar
Jean Dutour
In article <biadg0$ovt$, Anthony wrote:
"Cyrille "cns" Szymanski" a écrit :

struct str tab[] = { {4, "plop"},{5,"pwet"} } ;



les char *chaine = "coucou"; ça va 5 minutes...



Constructif comme réponse ...


C'est juste une remarque et je ne veux pas m'avancer à tort pour critiquer
son utilisation ici.

Pour tout ce qui n'est pas message statique (genre message d'erreur)
l'inconvénient de cette méthode est qu'on est tenté d'appeler des
fonctions

dessus (ex. strtok) et on pleure à cause d'une "segmentation fault".



Je ne sais pas pour Jean mais en fait, moi j'avais compris autre chose dans
ta réponse, peut être parce que je n'utilise que très rarement ce genre de
notations et donc n'ai aucun problème avec strtok() ou autre.
Personnelement j'avais compris que tu en avais marre des exemples débiles de
chaine du genre coucou plop ou autre, de même que j'ai déja vu la remarque
que foo, bar et autre était ennuyeux à lire à la fin :-)

J'avais donc mal interprété ton message pour ma part, qui est justifié!


Tout pareil, desole.

Jean






Avatar
Cyrille \cns\ Szymanski
Tout pareil, desole.

Jean


Je vous dois des excuses alors.

--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Jean Dutour wrote:

J'ai défini des structures (ci-dessous un exemple) :
- "str" défini une chaîne de caractères
- "type" contient un entier et un tableau de str

struct str {
int l;
char *s;
};

struct type {
int i;
struct str s[]; <-- problème


Pas du C. Il faut une taille. Normal pour un tableau non?

};


int main()
{
struct type t = {
i: 1,
s: {
{4, "plop"}
}
};

printf("%d %d %sn", t.i, t.s->l, t.s->s);
}


Mais le compilateur "râle" parce qu'il n'a pas la taille du tableau :
$ gcc -g test.c
test.c:8: array size missing in `s'


Bah oui, c'est normal...

Mais si je déclare :

struct type {
int i;
struct str *s; <-- encore problème


Quel problème ? Il faut juste penser à l'initialiser avant utilisation.

};

L'initialisation ne marche plus (ce que je comprends bien puisque
{4, "plop"} n'est pas une adresse pour struct str *s.

Y-a-t-il une solution à mon problème ?


Initialisation dynamique (à l'exécution).

J''ai plusieurs types, et tous n'ont pas le même nombre de "struct str"
... mais je souhaite pouvoir faire mes initialisations à la main comme
dans le main ci-dessus.


Va pas être possible, je le crains.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Cyrille "cns" Szymanski" wrote:

struct str tab[] = { {4, "plop"},{5,"pwet"} } ;



les char *chaine = "coucou"; ça va 5 minutes...



Et ? Qu'as-tu à ajouter à ton intéressante contribution?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/