Bonjour,
Je voudrais juste une confirmation
Sur un processeur 32bits les adresses en C++ sont stockées sur 32 bits.
Donc on peut stocker cette valeur dans un long ?
Merci.
Bonjour,
Je voudrais juste une confirmation
Sur un processeur 32bits les adresses en C++ sont stockées sur 32 bits.
Donc on peut stocker cette valeur dans un long ?
Merci.
les tailles des adresses sont les tailles des pointeursLe pointeurs sont faits justement pour stocker des adresses... Il est inutile (et dangeureux dans certaines mesures) de les stocker dans autre chose...
Code : Sélectionner tout - Visualiser dans une fenêtre à part sizeof(void*);
Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)
C'est complétement dépendant de l'architecture.Sur un processeur 32bits les adresses en C++ sont stockées sur 32 bits
Il me semble qu'il y a un type standard pour ça ; à la manière de std::size_t pour les tailles.Donc on peut stocker cette valeur dans un long ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
je dois faire correspondre la structure FILE avec une structure FILE_2 qui m'est propre.
Je veut donc mettre l'adresse de FILE dans un champ de FILE_2 car pour l'utilisateur doit manipuler le type FILE_2 et ne peut en aucun cas le changer. La structure FILE_2 contenant un long...
N'y a-t'il pas un "standard", pour les processeurs récents équipant les PC grand public et sous Windows par exemple (P IV, AThlon...)
Mais pourquoi ne le stockes tu pas simplement dans un void*? Ne peux tu pas modifier ton type FILE_2?
Si tu cherches le bon type alors c'est FILE*, pas un type entier.
Si tu ne cherches pas le bon type alors tu cherches quoi au juste ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Si j'ai bien saisi (cela va permettre d'eclaircir ton cas), tu as un type FILE_2 a disposition et non modifiable, et tu veux d'une maniere ou d'une autre qu'il contienne une "reference" a un FILE . De la ton idee d'uiliser un long int (apparement qui ne sert a rien donc) appartenant a FILE_2 pour pointer sur un FILE. A-t-on bien compris? Nous dis tu que tu DOIS faire du bricolage pour faire reference a un FILE (ce n'est pas pegoratif, c'est juste pour comprendre) depuis FILE_2?
Mais ton long int, il sert bien a quelque chose, ce n'est pas une variable mise la au cas ou... Sinon il aurait ete plus intelligent de mettre un void*...![]()
J'ai mon type FILE_2 et dans ce type je veut stocker l'adresse du FILE* pour pouvoir le retrouver ultérieurement. L'utilisateur manipule le type FILE_2 pour tous ces accès fichiers. Ensuite, il appelle mes fonctions (myfwrite par ex) avec son type FILE_2.Dans myfwrite, je fais la correspndance avec le FILE* pour réélement accèder au fichier en appelant fwrite.
Je ne peut pas modifier le prototype de la fonction myfwrite ni FILE_2.
Je veux donc uniquement savoir si, une adresse est stockable dans un long. Je l'ai testé sur ma machine et ca fonctionne mais je ne sais pas si sur toutes les machines un long suffit.
En fait, je dois faire fonctionner un code qui a déjà été écrit pour un terminal sur un PC. Sur le terminal, la fonction fwrite prend en paramètre non pas un FILE * mais une autre structure (FILE_2) contenant un long.Envoyé par harsh
Cette structure ne sert à rien d'autre sur le PC. Cepeandant je ne dois pas modifier le .h qui la définit.
Rien (si mes souvenirs sont bons) ne le garantit dans la norme, même si effectivement ça a des chances de marcher sur beaucoup de plateformes.Je veux donc uniquement savoir si, une adresse est stockable dans un long
Donc tu fais quoi là ?![]()
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Tu ne sembles pas avoir le choix, mais es tu sur que le long que tu utilises ne sert a rien d'autre (il n'avait aucun interet de se trouver la?)
Si tu as d'autres long sous la main, tu peux faire un test avec un sizeof () sur ton FILE* et tu le concatene sur plusieurs long au besoin... Mais ca ne te garantie pas qu'aucun systeme ne te face planter le code
![]()
Et pour être sûr, pourquoi ne pas passer par une map qui convertisse un long en FILE* ?
Edit : Ou mieux encore, une map avec en index un FILE2 et qui permette de retrouver le FILE correspondant
Merci
Pour la rapidité des réponses !!!
Je vais laisser comme ca de toute facon je n'ai pas beaucoup le choix.
Y'a intptr_t sinon je crois
Si tu ne peux pas modifier FILE_2, il n'y a rien que tu puisses faire. Tu es bloqué avec un design tout pourri. Et il ne te reste qu'à espérer de toujours avoir sizeof(FILE*) <= sizeof(long). A la limite, tu peux rajouter une assertion statique dans ton code. Et mettre en commentaire à côté (si jamais cela devait ne pas compiler) comme quoi quelqu'un a eu deux drôles d'idées de design (mettre un FILE* dans un long, et avoir une subtituabilité bourrine via un reinterpret_cast pour extraire le FILE * (si j'ai bien compris ce que tu as décris)).
Il te faut aussi prier que les tailles soient bien égales sinon, d'une plateforme à l'autre, c'est le coup à ce que les données soient mal alignées et que tu n'extrais pas la bonne addresse. Un enum pourrait sauver la mise, mais il ne permettrait pas pour autant la substituabilité par reinterpret_cast<>.
Des assertions statiques et des prières. C'est tout ce que tu as à ta disposition![]()
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
En effet, un pointeur tient dans un long sous beaucoup de plate-formes 32bits et certaines plate-formes 64bits (notamment, PAS sous Win64), mais rien n'est garanti sans utiliser un type approprié (intptr_t standard, INT_PTR et sa bande sous Windows...).
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.
Ah bon ?(notamment, PAS sous Win64)
Il me semblait qu'un long faisait 64 bits avec GCC sur AMD64.
Par GCC, tu supposes un MinGW ?
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.
Partager