Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

structure pointées

5 réponses
Avatar
nicolas
bonjour =E0 tous,
j'aimerais avoir votre aide pour realiser le code suivant:

je souhaite stocker des valeurs dans une structure, disons Content.
je souhaite acceder =E0 cette structure par un pointeur stock=E9 dans une
autre structure, disons Fils
je souhaite associer =E0 ce pointeur une valeur de type double, disons
val.
je souhaite pouvoir acceder =E0 l'ensemble par Fils->val[x] et
Fils.P_Content[x].

primo, je ne sais pas si c'est la solution la plus simple.
mon id=E9e est de pouvoir identifier un contenu (Content) =E0 une valeur
(forcement de type double )val.

comme =E7a, en incr=E9mentant le pointeur de Fils sur val, je recherche
si la valeur stock=E9e correspond =E0 la valeur que je veux, et si oui,
je scanne la structure Content pour recup=E9rer les valeurs.

voila o=F9 j'en suis (=E7a coince):

struct Content {
size_t n;
unsigned char *val; /*ne depasse jamais la valeur 255*/
};

struct Fils {
size_t n;
struct Content *P_Content;
double *val;
};



pour allouer de la memoire =E0 un pointeur sur la structure Content,
j'utilise la fonction suivante

struct Content *C_new(size_t n) {
struct Content *p;

p =3D malloc(sizeof *p);
if (p !=3D NULL) {
p->val =3D malloc(n * sizeof *p->val);
if (p->val !=3D NULL) {
p->n =3D n;
while (n)
p->val[--n] =3D '\0';
} else {
free(p);
p =3D NULL;
}
}
return p;
}

pour allouer de la memoire =E0 un pointeur sur la structure Fils,
j'utilise la fonction suivante

struct Fils *F_new(size_t n) {
struct Fils *p;
size_t i =3D 100;

p =3D malloc(sizeof *p);
if (p !=3D NULL) {
p->val =3D =3D malloc(n * sizeof *p->val);
if (p->val !=3D NULL) {
p->n =3D n;
while (n)
p->val[--n] =3D 0.0;
} else {
free(p);
p =3D NULL;
}
p->P_Content =3D malloc(n * sizeof *p->P_Content);
if (p->P_Content !=3D NULL) {
while (n)
p->P_Content[--n] =3D C_new(i);
} else {
free(p);
p =3D NULL;
}
}
return p;
}


d=E9j=E0, que pensez-vous de ces deux fonctions?
est-ce comme =E7a qu'on alloue de la memoire =E0 un pointeur vers une
structure?
est-ce que l'ensemble vous parait faisable de cette mani=E8re, ou avez
vous une autre solution?

merci par avance,
nicolas

5 réponses

Avatar
Marc Boyer
Le 10-11-2006, nicolas a écrit :
bonjour à tous,
j'aimerais avoir votre aide pour realiser le code suivant:

je souhaite stocker des valeurs dans une structure, disons Content.
je souhaite acceder à cette structure par un pointeur stocké dans une
autre structure, disons Fils
je souhaite associer à ce pointeur une valeur de type double, disons
val.
je souhaite pouvoir acceder à l'ensemble par Fils->val[x] et
Fils.P_Content[x].


En C, commencer par choisir la syntaxe, c'est commencer par
choisir la structure de donnée, et ça me semble une
mauvaise idée.
Commençons par identifier à quoi doit servir cette structure
de donnée.

primo, je ne sais pas si c'est la solution la plus simple.
mon idée est de pouvoir identifier un contenu (Content) à une valeur
(forcement de type double )val.


C'est à dire une table associative ?

comme ça, en incrémentant le pointeur de Fils sur val,


???
Je ne comprends pas.

je recherche
si la valeur stockée correspond à la valeur que je veux, et si oui,
je scanne la structure Content pour recupérer les valeurs.


Vous avez un double d, et vous voulez retrouver
une donnée de type Content associée à ce double, c'est ça ?

voila où j'en suis (ça coince):

struct Content {
size_t n;
unsigned char *val; /*ne depasse jamais la valeur 255*/


C'est quoi qui ne dépasse jamais 255 ?

};

struct Fils {
size_t n;
struct Content *P_Content;
double *val;
};


pour allouer de la memoire à un pointeur sur la structure Content,
j'utilise la fonction suivante

struct Content *C_new(size_t n) {
struct Content *p;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = '';
} else {
free(p);
p = NULL;
}
}
return p;
}


Pourquoi pas plutôt
bool init_Content(struct Content *c, size_t n){
p->n= n;
p->val= calloc( n , sizeof p->val[0]); // Mise à 0 des bits
return p != NULL;
}

pour allouer de la memoire à un pointeur sur la structure Fils,
j'utilise la fonction suivante

struct Fils *F_new(size_t n) {
struct Fils *p;
size_t i = 100;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = 0.0;
} else {
free(p);
p = NULL;
}
p->P_Content = malloc(n * sizeof *p->P_Content);
if (p->P_Content != NULL) {
while (n)
p->P_Content[--n] = C_new(i);


fclc.c:51: error: incompatible types in assignment

p->P_Content[--n] est de type struct Content
et C_new est de type struct Content*.


} else {
free(p);
p = NULL;
}
}
return p;
}


déjà, que pensez-vous de ces deux fonctions?


Qu'il y en a une des deux qui ne compile pas.

est-ce comme ça qu'on alloue de la memoire à un pointeur vers une
structure?
est-ce que l'ensemble vous parait faisable de cette manière, ou avez
vous une autre solution?


Je pense que vous confondez pointeurs et tableaux, et que vous
gagneriez à faire des petits dessins qui illustre ce qui se
passe en mémoire.
Fils pointe sur un tableau de struct Content, et vous
n'avez qu'une fonction qui crée des struct Content*.
C'est dur de les faire fonctionner ensemble.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Avatar
Marc Boyer
Le 10-11-2006, nicolas a écrit :
je pourrais changer la structure Content dont je connais par avance le
nombre de valeur quelle doit contenir.


C'est à dire, connu à la compilation ?
Alors oui, changeons le type.

ce pourrait etre un tableau de x valeurs.
j'ai choisi le type unsigned char car je souhaite stocker des valeurs
de 0 à 255

par contre, la taille de Fils peut changer.
je voudrais pouvoir stocker dans Fils x valeurs de type double,
(associés) à x pointeurs sur la
structure Content.
x est modifié au cours du programme.


OK

je recherche
si la valeur stockée correspond à la valeur que je veux, et si oui,
je scanne la structure Content pour recupérer les valeurs.


Vous avez un double d, et vous voulez retrouver
une donnée de type Content associée à ce double, c'est ça ?


par exemple:
Fils->val[0] = 0.0
Fils->P_Content[0].val[0] = 1
Fils->P_Content[0].val[1] = 1
Fils->P_Content[0].val[2] = 1

et encore,

Fils->val[1] = 10.0
Fils->P_Content[1].val[0] = 10
Fils->P_Content[1].val[1] = 10
Fils->P_Content[1].val[2] = 10


OK

voila où j'en suis (ça coince):

struct Content {
size_t n;
unsigned char *val; /*ne depasse jamais la valeur 255*/


C'est quoi qui ne dépasse jamais 255 ?


la valeur que je stocke, mais comme énnoncé précedemment, (je crois)
cette structure peut devenir

struct Content {
uint8_t val[3]; /*ne depasse jamais la valeur 255*/
};


Ca me semble mieux, c'est plus clair.

struct Fils {
size_t n;
struct Content *P_Content;
double *val;
};


pour allouer de la memoire à un pointeur sur la structure Content,
j'utilise la fonction suivante

struct Content *C_new(size_t n) {
struct Content *p;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = '';
} else {
free(p);
p = NULL;
}
}
return p;
}


Pourquoi pas plutôt
bool init_Content(struct Content *c, size_t n){
p->n= n;
p->val= calloc( n , sizeof p->val[0]); // Mise à 0 des bits
return p != NULL;
}


ok


pour allouer de la memoire à un pointeur sur la structure Fils,
j'utilise la fonction suivante

struct Fils *F_new(size_t n) {
struct Fils *p;
size_t i = 100;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = 0.0;
} else {
free(p);
p = NULL;
}
p->P_Content = malloc(n * sizeof *p->P_Content);
if (p->P_Content != NULL) {
while (n)
p->P_Content[--n] = C_new(i);


fclc.c:51: error: incompatible types in assignment

p->P_Content[--n] est de type struct Content
et C_new est de type struct Content*.


et oui....
il faudrait que je le déclare comme
struct Content **P_Content


Quel intérêt ?
Pourquoi ne pas plutot faire
init_Content( &p->P_Content[--n] , i ) ;

et si je declare P_Content comme struct Content **P_Content


Quel intérêt d'avoir un tableau de pointeurs de Content plutôt
qu'un tableau de Content ?
Ca peut avoir des avantages lorsqu'on change la taille
du tableau, mais est-ce nécessaire dans votre appli ?

En passant, j'ai un module de getsion de tableau générique,
si vous voulez être testeur :-)


Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)



Avatar
nicolas
En C, commencer par choisir la syntaxe, c'est commencer par
choisir la structure de donnée, et ça me semble une
mauvaise idée.
Commençons par identifier à quoi doit servir cette structure
de donnée.


je pourrais changer la structure Content dont je connais par avance le
nombre de valeur quelle doit contenir.
ce pourrait etre un tableau de x valeurs.
j'ai choisi le type unsigned char car je souhaite stocker des valeurs
de 0 à 255

par contre, la taille de Fils peut changer.
je voudrais pouvoir stocker dans Fils x valeurs de type double,
(associés) à x pointeurs sur la
structure Content.
x est modifié au cours du programme.


primo, je ne sais pas si c'est la solution la plus simple.
mon idée est de pouvoir identifier un contenu (Content) à une valeur
(forcement de type double )val.


C'est à dire une table associative ?


oui

comme ça, en incrémentant le pointeur de Fils sur val,


???
Je ne comprends pas.


excusez-moi pour ça, c'est les restes d'une idée antérieure que j'ai
pas supprimé...

je recherche
si la valeur stockée correspond à la valeur que je veux, et si oui,
je scanne la structure Content pour recupérer les valeurs.


Vous avez un double d, et vous voulez retrouver
une donnée de type Content associée à ce double, c'est ça ?


par exemple:
Fils->val[0] = 0.0
Fils->P_Content[0].val[0] = 1
Fils->P_Content[0].val[1] = 1
Fils->P_Content[0].val[2] = 1

et encore,

Fils->val[1] = 10.0
Fils->P_Content[1].val[0] = 10
Fils->P_Content[1].val[1] = 10
Fils->P_Content[1].val[2] = 10



voila où j'en suis (ça coince):

struct Content {
size_t n;
unsigned char *val; /*ne depasse jamais la valeur 255*/


C'est quoi qui ne dépasse jamais 255 ?


la valeur que je stocke, mais comme énnoncé précedemment, (je crois)
cette structure peut devenir

struct Content {
uint8_t val[3]; /*ne depasse jamais la valeur 255*/
};



struct Fils {
size_t n;
struct Content *P_Content;
double *val;
};


pour allouer de la memoire à un pointeur sur la structure Content,
j'utilise la fonction suivante

struct Content *C_new(size_t n) {
struct Content *p;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = '';
} else {
free(p);
p = NULL;
}
}
return p;
}


Pourquoi pas plutôt
bool init_Content(struct Content *c, size_t n){
p->n= n;
p->val= calloc( n , sizeof p->val[0]); // Mise à 0 des bits
return p != NULL;
}


ok


pour allouer de la memoire à un pointeur sur la structure Fils,
j'utilise la fonction suivante

struct Fils *F_new(size_t n) {
struct Fils *p;
size_t i = 100;

p = malloc(sizeof *p);
if (p != NULL) {
p->val = = malloc(n * sizeof *p->val);
if (p->val != NULL) {
p->n = n;
while (n)
p->val[--n] = 0.0;
} else {
free(p);
p = NULL;
}
p->P_Content = malloc(n * sizeof *p->P_Content);
if (p->P_Content != NULL) {
while (n)
p->P_Content[--n] = C_new(i);


fclc.c:51: error: incompatible types in assignment

p->P_Content[--n] est de type struct Content
et C_new est de type struct Content*.


et oui....
il faudrait que je le déclare comme
struct Content **P_Content



} else {
free(p);
p = NULL;
}
}
return p;
}


déjà, que pensez-vous de ces deux fonctions?


Qu'il y en a une des deux qui ne compile pas.

est-ce comme ça qu'on alloue de la memoire à un pointeur vers une
structure?
est-ce que l'ensemble vous parait faisable de cette manière, ou avez
vous une autre solution?


Je pense que vous confondez pointeurs et tableaux, et que vous
gagneriez à faire des petits dessins qui illustre ce qui se
passe en mémoire.
Fils pointe sur un tableau de struct Content, et vous
n'avez qu'une fonction qui crée des struct Content*.
C'est dur de les faire fonctionner ensemble.


et si je declare P_Content comme struct Content **P_Content
...


Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)



Avatar
nicolas

je pourrais changer la structure Content dont je connais par avance le
nombre de valeur quelle doit contenir.


C'est à dire, connu à la compilation ?
Alors oui, changeons le type.


c'est ça, le type est connu et le nombre est connu


struct Content {
uint8_t val[3]; /*ne depasse jamais la valeur 255*/
};


Ca me semble mieux, c'est plus clair.

struct Fils {
size_t n;
struct Content *P_Content;
double *val;
};





Quel intérêt d'avoir un tableau de pointeurs de Content plutôt
qu'un tableau de Content ?
Ca peut avoir des avantages lorsqu'on change la taille
du tableau, mais est-ce nécessaire dans votre appli ?


le nombre de pointeurs sur Content, de m^eme que le nombre de pointeurs
sur (double) val est incrémenté ou décrémenté pendant
l'utilisation, mais pas de beaucoup (de 1 à chaque fois).


En passant, j'ai un module de getsion de tableau générique,
si vous voulez être testeur :-)


je veux bien l'essayer pour mon cas de figure, oui



Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)





Avatar
Marc Boyer
Le 10-11-2006, nicolas a écrit :
Quel intérêt d'avoir un tableau de pointeurs de Content plutôt
qu'un tableau de Content ?
Ca peut avoir des avantages lorsqu'on change la taille
du tableau, mais est-ce nécessaire dans votre appli ?


le nombre de pointeurs sur Content, de m^eme que le nombre de pointeurs
sur (double) val est incrémenté ou décrémenté pendant
l'utilisation, mais pas de beaucoup (de 1 à chaque fois).


Vous confondez pointeur et tableau (encore).
C'est le nombre Content et de double stockÃs qui augmente,
pas le nombre de pointeurs sur.

En passant, j'ai un module de getsion de tableau générique,
si vous voulez être testeur :-)


je veux bien l'essayer pour mon cas de figure, oui


Si vous etes du genre a coder le WE, vous pouvez
aller voir 'code C' sur http://www.enseeiht.fr/~boyer/Tools.html.
Pour le support, il faudra attendre lundi, et on fera
cela plutot par email, je ne pense pas que cela ait
sa place ici.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)