Bonjour,
pourquoi en C on ne peut pas convertir un void* en double je croyais que le type void etait le type générique ?
merci d'avance.
Bonjour,
pourquoi en C on ne peut pas convertir un void* en double je croyais que le type void etait le type générique ?
merci d'avance.
Salut,
void * est le type de pointeur générique, pas le type générique. Tu peux caster un "void *" en "double *" mais pas en "double".
Le type void tout court n'a pas de sens, à part dans les signatures de fonction.
void* est un pointeur générique, mais reste un pointeur.
double, c'est un nombre.
Edit: Non seulement je me fais griller, mais en plus je dis des conneries...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Tu a voulu dire nombre à virgule flottante...Envoyé par Médinoc
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
ah ok merci et pourquoi ca ca marche :
tabgen[i]= (long *)(atol(tabE[i]));
et pas ca :
tabgen[i]= (double *)(atof(tabE[i]));
avec tabgen[i] de type void **
Si on veut se la jouer chacal, on peut se permettre de caster un int/long en void *, car il s'avere qu'un pointeur (de n'importe quel type) prend la meme place qu'un entier long sur pas mal de plateformes.
Mais faire ça c'est casser l'abstraction du sizeof
double prend plus de place qu'un int et donc ça ne rentre pas dans un void *
merci,
encore un question alors pourquoi le type float qui est sur 4octets interdis aussi cela ?
Il faut utiliser les bonnes fonctions
atol() Convert string to long (function)
atoi() Convert string to integer (function)
atof() Convert string to double (function)
Tu as vu une adresse quelque part ?Envoyé par EnigmuS
Arrête de faire n'importe quoi et réfléchi...
Le problème n'est pas qu'il y ai une adresse quelque part mais de caster le type void en int/long/double en filoutant (cast de void * et long * etc...) je sais que c'est trés moche Emmanuel pas besoin d'enfoncer le clous lool
alors si tu sais contourner ce type d'écriture en C je t'en priemais j'ai vraiment besoin d'avoir le type réel dans ce tableau car sinon dans mon asm il considére ca comme un pointeur et me fait un General Protection fault alors qu'avec tabgen[i]= (long *)(atol(tabE[i])); il m'affiche le bon résultat.
J'aimerais contourner ca et apparemment c'est possible en C99 mais y aurait-il moyen d'avoir plus d'explication sur intptr_t, j'ai cherché d'autre example mais j'avoue ne pas bien comprendre. intptr_t est un entier signé pouvant stocker un pointeur mais j'arrive pas a voir ou ca empeche de faire ce qui a plus haut arf
Merci d'avance.
Un type void* est un pointeur sur n'importe quel objet. Ce n'est pas un objet qui peut contenir n'importe quoi.Envoyé par EnigmuS
Par exemple :
est correct mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void *p = malloc (sizeof (double)); double *pd = p; *pd = 12.34; ... free (p), p = NULL, pd = NULL;
est non seulement faux (comportement indéfini), mais totalement illogique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part void *p = (void*) 12.34;
Partager