1) Quand on écrit des liens URL dans les messases de linuxfr, il faut faire attention à détacher toute ponctuation du lien; la parenthèse fermante et le point accolés à ton lien le rendent invalide ( http://linuxfr.org/forums/14/16571.html ).
2) Il s'agit d'un problème de programmation C. Je n'ai pas réussi à voir les sources (d'après le rapport de compilation, c'est le plugin VC qui plante, je ne l'ai pas trouvé sur le site); mais le message est clair: les gens qui ont codé ce plugin ont, à plusieurs moments, fait un cast d'une valeur de type pointeur vers un type entier qui n'est pas assez grand.
En pratique, ça peut ressembler à: float f = 5.0f;
float *p = &f
int i;
i = (int) p;
La conversion entre un pointeur et un type entier est, au sens de la norme C, implementation-defined, ce qui veut dire que le résultat d'une telle conversion peut varier d'une plate-forme à une autre.
En particulier, le domaine de valeurs d'un type pointeur peut ne pas entrer dans le domaine de valeurs d'un type entier arbitraire; il peut y avoir plus de valeurs possibles pour un float* que pour un int sur une machine, pour reprendre mon exemple (je ne sais pas si ça existe, c'est juste un exemple de ce qui peut arriver), donc il y aura une perte d'information possible; d'où l'avertissement que t'envoie ton compilateur.
La solution propre serait de ne pas faire de cast entre valeur de type pointeur et un type entier. Cela augmenterait largement la portabilité du code. Mais, si cela est trop difficile, ou risque de casser une interface quelconque (ce qui montrerait, AMHA, une erreur de conception assez grosse), il y a une autre solution: utiliser un type entier adapté à ce genre de choses. La norme C99 définit les types optionels intptr_t et uintptr_t (7.18.1.4 du n1124.pdf) qui sont faits exactement pour ça... La norme garantit que, quand l'implémentation les fournit, les conversions void* -> [u]intptr_t -> void* se font sans perte(*).
Par ailleurs, les tailles (ou plus précisément les domaines de valeurs) des types pointeurs ne sont pas contraintes, ce qui fait qu'un pointeur void* n'a pas forcément la même taille qu'une pointeur sur int*, par exemple... Il faut donc faire attention à ne caster que du void* vers les [u]intptr_t.
(*) Plus précisément, la norme ne garantit qu'une comparaison entre le résultat de la conversion void* -> [u]intptr_t -> void* et la valeur de départ renverra une égalité. (i.e. p == (void*)(intpre_t) p , si p est de type void*).
# Problème de programmation C
Posté par alf . En réponse au message warning: cast from pointer to integer of different size. Évalué à 2.
2) Il s'agit d'un problème de programmation C. Je n'ai pas réussi à voir les sources (d'après le rapport de compilation, c'est le plugin VC qui plante, je ne l'ai pas trouvé sur le site); mais le message est clair: les gens qui ont codé ce plugin ont, à plusieurs moments, fait un cast d'une valeur de type pointeur vers un type entier qui n'est pas assez grand.
En pratique, ça peut ressembler à:
float f = 5.0f;
float *p = &f
int i;
i = (int) p;
La conversion entre un pointeur et un type entier est, au sens de la norme C, implementation-defined, ce qui veut dire que le résultat d'une telle conversion peut varier d'une plate-forme à une autre.
En particulier, le domaine de valeurs d'un type pointeur peut ne pas entrer dans le domaine de valeurs d'un type entier arbitraire; il peut y avoir plus de valeurs possibles pour un float* que pour un int sur une machine, pour reprendre mon exemple (je ne sais pas si ça existe, c'est juste un exemple de ce qui peut arriver), donc il y aura une perte d'information possible; d'où l'avertissement que t'envoie ton compilateur.
La solution propre serait de ne pas faire de cast entre valeur de type pointeur et un type entier. Cela augmenterait largement la portabilité du code. Mais, si cela est trop difficile, ou risque de casser une interface quelconque (ce qui montrerait, AMHA, une erreur de conception assez grosse), il y a une autre solution: utiliser un type entier adapté à ce genre de choses. La norme C99 définit les types optionels intptr_t et uintptr_t (7.18.1.4 du n1124.pdf) qui sont faits exactement pour ça... La norme garantit que, quand l'implémentation les fournit, les conversions void* -> [u]intptr_t -> void* se font sans perte(*).
Par ailleurs, les tailles (ou plus précisément les domaines de valeurs) des types pointeurs ne sont pas contraintes, ce qui fait qu'un pointeur void* n'a pas forcément la même taille qu'une pointeur sur int*, par exemple... Il faut donc faire attention à ne caster que du void* vers les [u]intptr_t.
(*) Plus précisément, la norme ne garantit qu'une comparaison entre le résultat de la conversion void* -> [u]intptr_t -> void* et la valeur de départ renverra une égalité. (i.e. p == (void*)(intpre_t) p , si p est de type void*).