Accueil > Forum > > > > probleme macro et cast !!! argh !!!
probleme macro et cast !!! argh !!!
mercredi 19 novembre 2003 à 23:35:41 |
probleme macro et cast !!! argh !!!

ToasTy62
|
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 (pr precision : #define BSK_TYPE_INTEGER 6) #define returnType(p, t) (((t)==BSK_TYPE_INTEGER) ? *(int*)p : *(float*)p) 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 !
|
|
jeudi 20 novembre 2003 à 08:07:21 |
Re : probleme macro et cast !!! argh !!!

garslouche
|
Si j'ai bien compris p peut être un pointeur sur float ou sur int, et tu veux pouvoir le caster indifférement en float ou en int, c'est ça ?
Quoiqu'il en soit ce n'est pas toujours le sinon qui est executé!
il faut comprendre comment une valeur est stockée en mémoire.
Quand tu fais float f = 123.4; 4 octets sont réservés pour stocker la valeur 123.4 mais dans un format spécial (les fameuses virgules flottantes). Ca s'appelle IEEE 754 si ça t'interesse : http://www.programmationworld.com/site/cours.asp?Action=cours&numero=179
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
|
|
jeudi 20 novembre 2003 à 09:37:40 |
Re : probleme macro et cast !!! argh !!!

ToasTy62
|
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?
|
|
jeudi 20 novembre 2003 à 11:49:43 |
Re : probleme macro et cast !!! argh !!!

garslouche
|
Ok alors j'ai bien plus simple pour toi!
Utilise Union
Je ne sais pas si tu connais. Ex: Union IntFloat { int n; float f; }
typedef struct Variable { char type; IntFloat valeur; }
Ton IntFloat prendra toujours 4 octets et selon que tu utilises n ou f tu aura un entier ou un flottant.
Tu n'as plus qu'à faire une fonction que te retourne le float si le type est FLOAT et le int si le type est INT.
Va dans mes sources, j'utilise un truc dans ce genre ("langage de script pour automatiser les actions dans Windows")
|
|
jeudi 20 novembre 2003 à 12:06:26 |
Re : probleme macro et cast !!! argh !!!

ToasTy62
|
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
|
|
jeudi 20 novembre 2003 à 12:08:49 |
Re : probleme macro et cast !!! argh !!!

ToasTy62
|
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???
|
|
jeudi 20 novembre 2003 à 14:25:39 |
Re : probleme macro et cast !!! argh !!!

garslouche
|
Je te propose ce code:
union IntFloat { float type0; int type1; };
typedef struct { IntFloat* valeur; char type; } Variable;
#define GetIntFloatA(valeur, num) valeur->type##num #define GetIntFloat(variable) variable.type==0 ? (float)GetIntFloatA(variable.valeur, 0) : (int)GetIntFloatA(variable.valeur, 1)
int main(int argc, char* argv[]) { // pour les float IntFloat valFloat valFloat.type1 = 123; Variable varFloat varFloat.type = 0 varFloat.valeur = &val;
float f = GetIntFloat(var);
// pour les int IntFloat valInt; valInt.type1 = 123; Variable varInt; varInt.type = 1; varInt.valeur = &val;
int i = GetIntFloat(var); return 0; }
comme ça GetIntFloat te donne un int quand ta Variable est du type int et un float quand ta varaible est du type float.
PS: pour les double ça ne pose pas vraiment de pb. Le seul truc c'est que ton union fera tjrs 8 octets même si c'est pour stocker un int ou un float.
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac
|
|
jeudi 20 novembre 2003 à 14:31:19 |
Re : probleme macro et cast !!! argh !!!

garslouche
|
Et même tu peux ne mettre que #define GetIntFloat(variable) variable.type==0 ? variable.valeur->type0 : variable.valeur->type1
comme macro!
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac
|
|
jeudi 20 novembre 2003 à 18:47:35 |
Re : probleme macro et cast !!! argh !!!

ToasTy62
|
// 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; }; };
#define returnType(p, t) (t==0) ? p.i : p.f
int main(int args, char argv[]) { param prm; prm.i = 5; prm.type = 0;
switch(prm.type) { case 0: printf("i -> %i(%i)\n", returnType(prm, prm.type), prm.i); break; case 1: printf("f -> %f(%f)\n", prm.f, returnType(prm, prm.type)); break; } system("pause"); }
// dis-moi toré pa icq, msn ou aim pr k'on puisse discuter de ca? jte montreré les trucs bizarres ke g trouvé ac ce code... // aim : toasty62 // msn : toasty62@aol.com // icq : 225399580 // voila! @pluche ! // ps : ca marche tjs pas... bouhouhou !!!
|
|
jeudi 20 novembre 2003 à 20:19:43 |
Re : probleme macro et cast !!! argh !!!

garslouche
|
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;
union { float type0; int type1; };
} param;
#define GetIntFloat(variable) variable.type==0 ? variable.type0 : variable.type1
int main(int argc, char* argv[]) { // pour les float param paramFloat; paramFloat.type = 0; paramFloat.type0 = 123.4;
float f = GetIntFloat(paramFloat);
// pour les int param paramInt; paramInt.type = 1; paramInt.type1 = 123;
int i = GetIntFloat(paramInt);
printf("float=%f\tint=%d\n", f,i);
system("pause"); return 0; }
Bonne continuation
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac
|
|
Cette discussion est classée dans : macro, type, probleme, cast, argh
Répondre à ce message
Sujets en rapport avec ce message
probleme cast [ par morgandetoi06 ]
svp aidez moi...j utilise la fonction pow qui renvoie un doubledonc je fait double b; // nombredouble j; // exposantdouble n; // reponsen=pow(b,j);don
template [ par dam1234 ]
G un probleme avec une methode de classe declaree en template. J'aurai besoin de savoir comment est ce que l'on fait pour connaitre quel a été le type
probleme de compilation [ par casper_2 ]
A ma compilation g un message de type:(transfert est une fonction);warning:type mismatch with previous implicit declarationwarning:previous implicit d
probleme de pointeur et de liste chainée [ par krater ]
sur un projet de video-club nous avons utilise une liste double chainées cepedant, nous avons quelque récurent à la compillation si une reponse pouvai
Probleme de compilatio en utilisant des socket [ par casper_2 ]
Bonjour,j'utilise dev_cpp,et je debute avec l'utilisation des sockets.ama compilation,g un message de type" [Linker error] undefined reference to `WS
Cast LONGLONG en LPCTSTR [ par forfait3 ]
Bonjour,je voudrais insérer des champs d'un recordset qui sont de type LONGLONG (__int64) dans un combobox.Or, la méthode d'ajout AddString prends un
Allocation de variable [ par CrazySeb ]
Bonsoir a tous, j'ai un probleme assez bete qui m'empeche d'avancer dans mon travail... Je vous explique le probleme. J'ai deux sous fonctions qui
probleme avec le type du projet ! [ par anonyme_man_in_this_world ]
salut !!j'ai fait deux application (Win32 console ) communiquant entre eux .cepandant lorsque j'ai crée un nouveau projet Win32 ,et j'ai fait copier
Probleme avec une variable de type DWORD [ par kgadhi ]
Bonjour tout le monde,J'aimerais savoir comment on fait pour ecrire une variable de type DWORD dans un fichier,DWORD tmp = 0;....FILE *file = NULL;if
un p'tit coup de main svp!! [ par billyjb2000 ]
slt!je post ca ici car je trouve pas de theme destiné au probleme de librairie.donc le probleme c'est qu'a la compilation d'un programme sous visual c
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|