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.
Version imprimable
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:sizeof(void*);
C'est complétement dépendant de l'architecture.Citation:
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.Citation:
Donc on peut stocker cette valeur dans un long ?
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?
Ouai c'est ca je ne peux pas modifier le 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 ?
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*...:roll:
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.Citation:
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.Citation:
Je veux donc uniquement savoir si, une adresse est stockable dans un long
Donc tu fais quoi là ? :D
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:D... 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 :(
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...).
Ah bon ?Citation:
(notamment, PAS sous Win64)
Il me semblait qu'un long faisait 64 bits avec GCC sur AMD64.
Par GCC, tu supposes un MinGW ?