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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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...
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...
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.
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.
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.
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
In article <biadg0$ovt$1@tem.asynchrone.net>, Anthony wrote:
"Cyrille "cns" Szymanski" <cns2@cns.invalid> 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é!
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é!
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/
In 'fr.comp.lang.c', Jean Dutour <jeand@hotmail.com> 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- emdelYOURBRA@noos.fr [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/
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/
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/
In 'fr.comp.lang.c', "Cyrille "cns" Szymanski" <cns2@cns.invalid> 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- emdelYOURBRA@noos.fr [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/