Ensuite, en fonction, des information, on alloue la taille nécessaire pour chaque objet et conteneur. On peut éventuellement faire un tableau flexible de conteneurs...
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des données dans un tableau flexible de unsigned char selon un 'plan' défini par une syntaxe de description de données (ASN.1, XDR etc.) qui permet de fabriquer une structure d'information contenant le nom des données leurs offsets, tailles etc. C'est utile pour mapper une zone mémoire précise (Flash, RAM sauvergardée...) ou des informations sur disque...
Sky's the limit...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au monde." -- Albert Camus.
nicolas wrote on 21/01/05 :
bonsoir a tous,
j aimerai faire une fonction generique pour remplir n importe quel type de
structure.
void remplir_struct(char **data, void *structur);
mon tableau est remplit de la facon suivante: deux cases par deux cases:
data[0] = "toto" /* la valeur */
data[1] = "str" /* le type */
data[2] = "84"
data[3] = "int"
et ainsi pouvoir remplir une structure de ce type
struct toto {
char *str;
int i;
};
Ca, c'est pas trop possible.
je pensais pouvoir remplir le void *structur a coup de sizeof et de cast mais
je ne pense pas que ce soit une bonne idee..
Ensuite, en fonction, des information, on alloue la taille nécessaire
pour chaque objet et conteneur. On peut éventuellement faire un tableau
flexible de conteneurs...
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des
données dans un tableau flexible de unsigned char selon un 'plan'
défini par une syntaxe de description de données (ASN.1, XDR etc.) qui
permet de fabriquer une structure d'information contenant le nom des
données leurs offsets, tailles etc. C'est utile pour mapper une zone
mémoire précise (Flash, RAM sauvergardée...) ou des informations sur
disque...
Sky's the limit...
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.
Ensuite, en fonction, des information, on alloue la taille nécessaire pour chaque objet et conteneur. On peut éventuellement faire un tableau flexible de conteneurs...
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des données dans un tableau flexible de unsigned char selon un 'plan' défini par une syntaxe de description de données (ASN.1, XDR etc.) qui permet de fabriquer une structure d'information contenant le nom des données leurs offsets, tailles etc. C'est utile pour mapper une zone mémoire précise (Flash, RAM sauvergardée...) ou des informations sur disque...
Sky's the limit...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"Mal nommer les choses c'est ajouter du malheur au monde." -- Albert Camus.
nicolas
Emmanuel Delahaye wrote:
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des données dans un tableau flexible de unsigned char selon un 'plan' défini par une syntaxe de description de données (ASN.1, XDR etc.) qui permet de fabriquer une structure d'information contenant le nom des données leurs offsets, tailles etc. C'est utile pour mapper une zone mémoire précise (Flash, RAM sauvergardée...) ou des informations sur disque...
Sky's the limit...
merci beaucoup je vais aller dans ce sens ... merci encore
Emmanuel Delahaye wrote:
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des
données dans un tableau flexible de unsigned char selon un 'plan' défini
par une syntaxe de description de données (ASN.1, XDR etc.) qui permet
de fabriquer une structure d'information contenant le nom des données
leurs offsets, tailles etc. C'est utile pour mapper une zone mémoire
précise (Flash, RAM sauvergardée...) ou des informations sur disque...
Sky's the limit...
merci beaucoup je vais aller dans ce sens ...
merci encore
On peut aussi utiliser une méthode 'plate' qui consiste à mapper des données dans un tableau flexible de unsigned char selon un 'plan' défini par une syntaxe de description de données (ASN.1, XDR etc.) qui permet de fabriquer une structure d'information contenant le nom des données leurs offsets, tailles etc. C'est utile pour mapper une zone mémoire précise (Flash, RAM sauvergardée...) ou des informations sur disque...
Sky's the limit...
merci beaucoup je vais aller dans ce sens ... merci encore
nicolas
bonsoir, j ai donc teste ce que vous m avez propose precedement mais je me heurte a un probleme: les floats
lorsqu il s'agit d un float le compilateur m interdit de faire cela : (float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float * mais sans resultat ... j ai essaye la meme chose avec les int: passe par un int * pour assigner la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
je vous remercie d avance pour vos reponses.
bonne soiree a tous.
bonsoir,
j ai donc teste ce que vous m avez propose precedement mais je me heurte
a un probleme: les floats
lorsqu il s'agit d un float le compilateur m interdit de faire cela :
(float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float *
mais sans resultat ...
j ai essaye la meme chose avec les int: passe par un int * pour assigner
la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
lorsqu il s'agit d un float le compilateur m interdit de faire cela : (float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float * mais sans resultat ... j ai essaye la meme chose avec les int: passe par un int * pour assigner la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
je vous remercie d avance pour vos reponses.
bonne soiree a tous.
nicolas
je n'y arrive vraiment pas personne pour m aider ?
je n'y arrive vraiment pas personne pour m aider ?
lorsqu il s'agit d un float le compilateur m interdit de faire cela : (float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float * mais sans resultat ... j ai essaye la meme chose avec les int: passe par un int * pour assigner la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
je vous remercie d avance pour vos reponses.
bonne soiree a tous.
Emmanuel Delahaye wrote:
nicolas wrote on 23/01/05 :
je n'y arrive vraiment pas personne pour m aider ?
Poste le code qui ne fonctionne pas...
je l avais poste hier ... ca n a pas du fonctionner
==================================== bonsoir,
j ai donc teste ce que vous m avez propose precedement mais je me heurte
a un probleme: les floats
lorsqu il s'agit d un float le compilateur m interdit de faire cela :
(float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float *
mais sans resultat ...
j ai essaye la meme chose avec les int: passe par un int * pour assigner
la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
lorsqu il s'agit d un float le compilateur m interdit de faire cela : (float) index[7] = 0.4342;
j ai donc decide de passer par un pointeur de type float * mais sans resultat ... j ai essaye la meme chose avec les int: passe par un int * pour assigner la valeur, de meme sans resultat. D ou ma question:
pourquoi "(int) index[2] = 42" marche et non "*toto" ???
je me suis trompe quelque part mais je n arrive pas a trouver ou...
je vous remercie d avance pour vos reponses.
bonne soiree a tous.
Emmanuel Delahaye
nicolas wrote on 23/01/05 :
je n'y arrive vraiment pas personne pour m aider ?
Poste le code qui ne fonctionne pas...
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"Clearly your code does not meet the original spec." "You are sentenced to 30 lashes with a wet noodle." -- Jerry Coffin in a.l.c.c++
nicolas wrote on 23/01/05 :
je n'y arrive vraiment pas personne pour m aider ?
Poste le code qui ne fonctionne pas...
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*). L'assignation des données ne peut se faire que si on connait leur adresse et leur taille à coup de memcpy().
Il est préférable de définir un format commun de conteneur:
typedef struct { size_t size; /* taille d'un element */ size_t nb; /* nombre d'elements */ void *address; /* adresse du debut du bloc */ } cont_s;
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*).
L'assignation des données ne peut se faire que si on connait leur
adresse et leur taille à coup de memcpy().
Il est préférable de définir un format commun de conteneur:
typedef struct
{
size_t size; /* taille d'un element */
size_t nb; /* nombre d'elements */
void *address; /* adresse du debut du bloc */
}
cont_s;
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*). L'assignation des données ne peut se faire que si on connait leur adresse et leur taille à coup de memcpy().
Il est préférable de définir un format commun de conteneur:
typedef struct { size_t size; /* taille d'un element */ size_t nb; /* nombre d'elements */ void *address; /* adresse du debut du bloc */ } cont_s;
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*). L'assignation des données ne peut se faire que si on connait leur adresse et leur taille à coup de memcpy().
je remplis mon void **index avec les adresses de void *data, c est a dire que j'index chaque element de mon zone memoire data.
pour remplir mon tableau je devrai donc faire quelque chose comme ca :
memcpy(index[2], &value, sizeof(int)); /* pour un int */
Il est préférable de définir un format commun de conteneur:
typedef struct { size_t size; /* taille d'un element */ size_t nb; /* nombre d'elements */ void *address; /* adresse du debut du bloc */ } cont_s;
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*).
L'assignation des données ne peut se faire que si on connait leur
adresse et leur taille à coup de memcpy().
je remplis mon void **index avec les adresses de void *data, c est a
dire que j'index chaque element de mon zone memoire data.
pour remplir mon tableau je devrai donc faire quelque chose comme ca :
memcpy(index[2], &value, sizeof(int)); /* pour un int */
Il est préférable de définir un format commun de conteneur:
typedef struct
{
size_t size; /* taille d'un element */
size_t nb; /* nombre d'elements */
void *address; /* adresse du debut du bloc */
}
cont_s;
Tu fabriques un tableau de pointeurs sur des blocs anonymes (void*). L'assignation des données ne peut se faire que si on connait leur adresse et leur taille à coup de memcpy().
je remplis mon void **index avec les adresses de void *data, c est a dire que j'index chaque element de mon zone memoire data.
pour remplir mon tableau je devrai donc faire quelque chose comme ca :
memcpy(index[2], &value, sizeof(int)); /* pour un int */
Il est préférable de définir un format commun de conteneur:
typedef struct { size_t size; /* taille d'un element */ size_t nb; /* nombre d'elements */ void *address; /* adresse du debut du bloc */ } cont_s;
index = malloc(sizeof(void *) * strlen(MASK)); current = 0; for (count = 0; count < strlen(MASK); count++) { index[count] = data; data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une extension de certains compilateurs comme gcc qui n'est pas défini par la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur index[2] et tu détruis la valeur de index[2] au lieu de stocker 42 dans la mémoire vers laquelle index[2] pointe. L'affectation correcte serait
index = malloc(sizeof(void *) * strlen(MASK));
current = 0;
for (count = 0; count < strlen(MASK); count++)
{
index[count] = data;
data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une
extension de certains compilateurs comme gcc qui n'est pas défini par
la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur
index[2] et tu détruis la valeur de index[2] au lieu de stocker 42
dans la mémoire vers laquelle index[2] pointe. L'affectation correcte
serait
index = malloc(sizeof(void *) * strlen(MASK)); current = 0; for (count = 0; count < strlen(MASK); count++) { index[count] = data; data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une extension de certains compilateurs comme gcc qui n'est pas défini par la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur index[2] et tu détruis la valeur de index[2] au lieu de stocker 42 dans la mémoire vers laquelle index[2] pointe. L'affectation correcte serait
index = malloc(sizeof(void *) * strlen(MASK)); current = 0; for (count = 0; count < strlen(MASK); count++) { index[count] = data; data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une extension de certains compilateurs comme gcc qui n'est pas défini par la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur index[2] et tu détruis la valeur de index[2] au lieu de stocker 42 dans la mémoire vers laquelle index[2] pointe. L'affectation correcte serait
index = malloc(sizeof(void *) * strlen(MASK));
current = 0;
for (count = 0; count < strlen(MASK); count++)
{
index[count] = data;
data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une
extension de certains compilateurs comme gcc qui n'est pas défini par
la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur
index[2] et tu détruis la valeur de index[2] au lieu de stocker 42
dans la mémoire vers laquelle index[2] pointe. L'affectation correcte
serait
index = malloc(sizeof(void *) * strlen(MASK)); current = 0; for (count = 0; count < strlen(MASK); count++) { index[count] = data; data += get_size(mask[count]);
C'est du C GNU. En C tu devrais écire:
data = (char *) data + get_size(mask[count])
}
(int) index[2] = 42;
Ce n'est pas ce que tu veux. D'abord c'est un "lvalue cast", une extension de certains compilateurs comme gcc qui n'est pas défini par la norme de langage C. Ici ce cast a l'effet
index[2] = (void *)42;
c.a.d. tu essaies de stocker la valeur intégrale 42 *dans* le pointeur index[2] et tu détruis la valeur de index[2] au lieu de stocker 42 dans la mémoire vers laquelle index[2] pointe. L'affectation correcte serait