Mon problème est le suivant: pour chaque point je voulais pouvoir disposer de mémoire, plus ou moins grande, pour stocker des choses variées (des indices, des réels, etc...). Donc un *char me semblait une solution...
Pourquoi ne pas utiliser void* plutot que char*? Il est peut-être possible de structurer ces choses variées en utilisant une union contenant un double*, int*, etc. L'union évitera les casts et sera beaucoup plus propre.
sam.
Pourquoi pas? C'est juste que je ne comprend pas de quoi vous parlez...(Voir le sujet de la discussion...).
Void* veut dire pointeur sur n'importe quoi. C'est plus général que char* et il n'y a pas besoin de cast pour le convertir en double*, int*, etc.
double *dbl_ptr = (double*)p.type; double value = ((double*)p.type)[15];
Comme tu le vois il te faut caster la valeur de p.type pour la convertir en pointeur sur double. L'accès au 16eme element du tableau utilise aussi un cast.
double *dbl_ptr = p.type.as_double; // pas de cast double value = p.type.as_double[15]; // pas de cast
Aucun cast et le code est beaucoup plus clair.
sam.
Le 25/09/2010 07:47, Tanguy Briançon a écrit :
On 24/09/2010 15:23, Samuel DEVULDER wrote:
Le 23/09/2010 19:30, Tanguy Briançon a écrit :
Mon problème est le suivant: pour chaque point je voulais pouvoir
disposer de mémoire, plus ou moins grande, pour stocker des choses
variées (des indices, des réels, etc...). Donc un *char me semblait
une solution...
Pourquoi ne pas utiliser void* plutot que char*? Il est peut-être
possible de structurer ces choses variées en utilisant une union
contenant un double*, int*, etc. L'union évitera les casts et sera
beaucoup plus propre.
sam.
Pourquoi pas? C'est juste que je ne comprend pas de quoi vous
parlez...(Voir le sujet de la discussion...).
Void* veut dire pointeur sur n'importe quoi. C'est plus général que
char* et il n'y a pas besoin de cast pour le convertir en double*, int*,
etc.
double *dbl_ptr = (double*)p.type;
double value = ((double*)p.type)[15];
Comme tu le vois il te faut caster la valeur de p.type pour la convertir
en pointeur sur double. L'accès au 16eme element du tableau utilise
aussi un cast.
Mon problème est le suivant: pour chaque point je voulais pouvoir disposer de mémoire, plus ou moins grande, pour stocker des choses variées (des indices, des réels, etc...). Donc un *char me semblait une solution...
Pourquoi ne pas utiliser void* plutot que char*? Il est peut-être possible de structurer ces choses variées en utilisant une union contenant un double*, int*, etc. L'union évitera les casts et sera beaucoup plus propre.
sam.
Pourquoi pas? C'est juste que je ne comprend pas de quoi vous parlez...(Voir le sujet de la discussion...).
Void* veut dire pointeur sur n'importe quoi. C'est plus général que char* et il n'y a pas besoin de cast pour le convertir en double*, int*, etc.
double *dbl_ptr = (double*)p.type; double value = ((double*)p.type)[15];
Comme tu le vois il te faut caster la valeur de p.type pour la convertir en pointeur sur double. L'accès au 16eme element du tableau utilise aussi un cast.
Pour moi le type est point (sans s). Je reconnais que ce n'est pas très joli...
Si ce n'est pas joli et si tu le sais, pourquoi le faire ?
Ca marche...
Tu peux remplacer tous tes noms de type par t1, t2, t3 et tous tes noms de variable par v1, v2, v3, et ça continuera de marcher.
C'est toute l'ambiguité d'un code qui est fait pour une machine (faut que ça marche) et pour l'humain (faut le relire).
Je ne savais pas qu'on pouvait faire ça... Merci de l'info en tout cas!
On peut aussi utiliser le même "nom" struct point { int x,y; }; typedef struct point point; ou tout faire d'un coup typedef struct point { int x,y; } point ;
Marc Boyer -- En prenant aux 10% des francais les plus riches 12% de leurs revenus, on pourrait doubler les revenus des 10% les plus pauvres. http://www.inegalites.fr/spip.php?article1&id_mot0
Le 25-09-2010, Tanguy Briançon <briancon_tanguy@yahoo.fr> a écrit :
Pour moi le type est point (sans s). Je reconnais que ce n'est
pas très joli...
Si ce n'est pas joli et si tu le sais, pourquoi le faire ?
Ca marche...
Tu peux remplacer tous tes noms de type par t1, t2, t3 et tous
tes noms de variable par v1, v2, v3, et ça continuera de marcher.
C'est toute l'ambiguité d'un code qui est fait pour une machine
(faut que ça marche) et pour l'humain (faut le relire).
Je ne savais pas qu'on pouvait faire ça...
Merci de l'info en tout cas!
On peut aussi utiliser le même "nom"
struct point {
int x,y;
};
typedef struct point point;
ou tout faire d'un coup
typedef struct point {
int x,y;
} point ;
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Pour moi le type est point (sans s). Je reconnais que ce n'est pas très joli...
Si ce n'est pas joli et si tu le sais, pourquoi le faire ?
Ca marche...
Tu peux remplacer tous tes noms de type par t1, t2, t3 et tous tes noms de variable par v1, v2, v3, et ça continuera de marcher.
C'est toute l'ambiguité d'un code qui est fait pour une machine (faut que ça marche) et pour l'humain (faut le relire).
Je ne savais pas qu'on pouvait faire ça... Merci de l'info en tout cas!
On peut aussi utiliser le même "nom" struct point { int x,y; }; typedef struct point point; ou tout faire d'un coup typedef struct point { int x,y; } point ;
Marc Boyer -- En prenant aux 10% des francais les plus riches 12% de leurs revenus, on pourrait doubler les revenus des 10% les plus pauvres. http://www.inegalites.fr/spip.php?article1&id_mot0