ToasTy62
Messages postés47Date d'inscriptionmardi 4 septembre 2001StatutMembreDernière intervention12 mars 2004
-
19 nov. 2003 à 23:35
garslouche
Messages postés583Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention29 mai 2015
-
21 nov. 2003 à 11:23
bon voila le pb : g fé une tite macro ac une condition mais ca marchas pas des masses... un ti peu d'aide serait vraiment le bienvenue !!! marchi !
regardez cette tite macro
cette macro sert a caster un void* vers le type souhaité.
apparemment quoi que je fasse, c'est toujours le sinon qui est executé...
dc ca transforme toujours le pointeur void* p en *(float*)p... bouhouhou!
je vois vraiment pas le pb, c pitete le ? : ki est mal utilisé?
enfin bref, si qqun pouvait m'aider, ca m'eviterait de balance le pc... merci d'avance !
Je suppose que pour ton test tu as fait:
float f = 123.4;
void* pointeur = &f;
int n = returnType(pointeur, BSK_TYPE_INTEGER);
Là n ne va pas être égal à 123 mais à une valeur apparement incompréhensible. En fait dans ta macro tu récupère l'adresse des 4 octets du float, et tu dis "considère que c'est un entier". Donc l'ordi comprend que les 4 octets en question doivent être les cases-mémoire de ton entier. C'est pour ça que n vaut n'importe quoi (en fait tu utilisé un très bon moyen de faire une conversion IEEE !).
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac
ToasTy62
Messages postés47Date d'inscriptionmardi 4 septembre 2001StatutMembreDernière intervention12 mars 2004 20 nov. 2003 à 09:37
nan mais je sais tres bien tout ske tu me racontes...
bon je v mieux t'expliker l'utilisation
imagine ca :
typedef (void*) (*PFv) (...)
ensuite on assigne un pointeur de fonction dans
PFv call;
call = nianiania on s'en fout c un pointeur de fonction;
apres ->
call(returnType(p1, p1->type), returnType(p2, p2->type), etc...)
en fait le but c de faire un appel de fonction sachant qu'il faut caster void* p en le bon type.
p1 sera casté en int si p1->type == BSK_TYPE_INTEGER
p1 sera casté en float si p1->type == BSK_TYPE_FLOAT
mais il n'yaura JAMAIS de perte de données ! car justement le type des données est stocké dans p1->type.
je pe pa faire de call(*(float*)p1, etc...) paske p1 pourrait être un entier, tout depend de ce que le programme lui a assigné avant.... tu vois un peu le bazar?
ToasTy62
Messages postés47Date d'inscriptionmardi 4 septembre 2001StatutMembreDernière intervention12 mars 2004 20 nov. 2003 à 12:06
javé deja regardé la possibilité de l'union mais ya tjs un pb.
deja g pa précisé mé ya aussi le double, dc 8 octets... ensuite vu k'il est impossible de surcharger un retour de fonction c pa possible de faire une fonction ki retourne un entier, un float ou un double ! le pb se pose vraiment ds le cast...
g regardé ds ton code(ke g pa testé mé ki a l'air sympa) et en gros ta fé une fonction GetNombre() ki retourne un float a partir d'un float ou d'une chaine, mais moi fo vraiment ke ca retourne le type souhaité!!!
il me faut vraiment UNE SEULE fonction ou UNE SEULE macro ki retourne le type souhaité et le cast, vu ke ca doit pas rester un void*... :oP
Vous n’avez pas trouvé la réponse que vous recherchez ?
ToasTy62
Messages postés47Date d'inscriptionmardi 4 septembre 2001StatutMembreDernière intervention12 mars 2004 20 nov. 2003 à 12:08
g oublié de preciser, la fonction ki retourne le float si c'est un FLOAT et un int si c un INT c justement la macro ke g fait, en contournant le pb d'overload de retour... snifouille! y arriverais-je???
ToasTy62
Messages postés47Date d'inscriptionmardi 4 septembre 2001StatutMembreDernière intervention12 mars 2004 20 nov. 2003 à 18:47
// g créé ce tit code pr faire des tests et les resultats st vraiment surprenants !
// je c pa si c'est dû a des bugs ou o compilo...
// fo bidouiller ac la macro et le printf du case 0...
#include <windows.h>
#include <stdio.h>
struct param {
int type;
union {
char *c;
int i;
float f;
double d;
};
};
garslouche
Messages postés583Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention29 mai 20151 20 nov. 2003 à 20:19
C normal que ce que tu as fait ne marche pas : quand tu fais returnType(prm, prm.type) c'est pas comme returnType(prm, 0) même si prm.type vaut 0 !
Quoiqu'il en soit voici un code que j'ai testé (celui d'au dessus c'était un peu à l'aveuglette....dslé) et ça marche nickel :
typedef struct
{
char type;
g inséré la macro ds la fonction. et en fait moi c ds un cas comme ca ke j'en ai besoin et... ca marche pas !
pr le float ca passe, mais pr le paramInt ca indique 0...
bouhouhou ! g encore fait qqch de travers?
j'en finirais decidement jms ac de pb...
garslouche
Messages postés583Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention29 mai 20151 21 nov. 2003 à 11:23
Dslé mais je ne vois rien d'autre.
Je v qd mêm t'expliquer le pb pour que tu puisses poursuivre si tu veux...moi j'abandonne !
Quand on utilise
condition ? valeur1 : valeur 2
le type du résultat est automatiquement casté comme le type de valeur1. C'est pour ça que ça marche avec les float mais pas avec les int (sauf si on caste encore derrière!)
Bon courgae
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac