Page 1 sur 1

OS en 32/64 bits

Publié : mer. 06/juin/2007 12:58
par lionel_om
Bonjour,

Si je ne me trompe pas, les adresses des variables, fonctiosn, ... sont en 32 ou 64 bits selon la version de l'OS.

Je voudrais faire une structure qui serait définie avec les commande de pré-compilation (directive du compilo) afin de définir une structure (MemAddress) pour quelle soit dérivée d'un Long.
Le but est au final de créer une Lib avec TailBite, je sais pas si c'est possible ou si faut compiler deux version différentes.

Je ne sais pas s'il y a vraiment un problème ou vraiement une solution.
J'espère être assez clair...

Voilà un mini bout de bout pour expliciter un peu plus :

Code : Tout sélectionner

Structure MemAddress Extends Long
EndStructure

Debug SizeOf(MemAddress)
Merci d'avance
Lionel :wink:

Publié : mer. 06/juin/2007 13:18
par Progi1984
De mémoire, PB ne gère pas le 64bits !

Publié : jeu. 07/juin/2007 7:20
par lionel_om
Progi1984 a écrit :De mémoire, PB ne gère pas le 64bits !
Je crois que si car quelqu'un avait posté quelquechose en disant que SizeOf(Long) renvoyé 4 ou 8 (octets) selon la version de l'OS.

Mais en fait, je ne pense pas avoir réellement de problème car les Long s'adaptent automatiquement et je pense que les pointer aussi.
Le seul vrai pb est le fait que soit je distriburais ma Lib directement avec le source (ce qui n'ets pas un problème) ou soit compilée 2 fois avec TailBite sur des OS 32/64 bits (avec les sources toujours :P )

Lionel

Publié : jeu. 07/juin/2007 7:57
par KarLKoX
Sur un OS 64 bits, tu as deux mode de fonctionnement : 64 bits et mode compatible.
Etant donné que PB ne supporte pas le 64 bits de manière native (mode long), c'est à dire que le compilateur ne produit pas de code COFF x64, le code reste en 32 bits et fonctionnera en mode compatibilité.
Tout est récapitulé ici.

Publié : jeu. 07/juin/2007 7:58
par Dr. Dri
PB ne propose pas de compilation 64bits à ma connaissance
et si c'était le cas ca ne serait pas le type "long" en lui même qui changerais mais plutôt le type par défaut qui passerai au quad

Dri

Publié : jeu. 07/juin/2007 7:59
par KarLKoX
Il changerais en LONG_PTR ;)

Publié : jeu. 07/juin/2007 7:59
par lionel_om
KarLKoX a écrit :Sur un OS 64 bits, tu as deux mode de fonctionnement : 64 bits et mode compatible.
Etant donné que PB ne supporte pas le 64 bits de manière native (mode long), c'est à dire que le compilateur ne produit pas de code COFF x64, le code reste en 32 bits et fonctionnera en mode compatibilité.
Tout est récapitulé ici.
Je vais je ter un oeil.
Merci de ta réponse :wink:

Lio

Publié : jeu. 07/juin/2007 8:03
par lionel_om
Dr. Dri a écrit :PB ne propose pas de compilation 64bits à ma connaissance
et si c'était le cas ca ne serait pas le type "long" en lui même qui changerais mais plutôt le type par défaut qui passerai au quad

Dri
Donc faut pas que je type mes variables qui pointent sur une zone mémoire ?

Lio

Publié : jeu. 07/juin/2007 8:07
par Dr. Dri
KarLKoX a écrit :Il changerais en LONG_PTR ;)
Gné ?
lionel_om a écrit :Donc faut pas que je type mes variables qui pointent sur une zone mémoire ?

Lio
Les pointeurs ne sont intéressants que si le type est une structure ou une chaîne de caractères.

Dri

Publié : jeu. 07/juin/2007 9:00
par KarLKoX
Dr. Dri a écrit :
KarLKoX a écrit :Il changerais en LONG_PTR ;)
Gné ?

Dri
/* Win32 or Win64 dependent typedef/defines. */

#ifdef _WIN64

typedef signed __int64 INT_PTR, *PINT_PTR;
typedef signed __int64 LONG_PTR, *PLONG_PTR;

typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
typedef unsigned __int64 DWORD_PTR, *PDWORD_PTR;

#define MAXINT_PTR 0x7fffffffffffffff
#define MININT_PTR 0x8000000000000000
#define MAXUINT_PTR 0xffffffffffffffff

typedef int HALF_PTR, *PHALF_PTR;
typedef unsigned int UHALF_PTR, *PUHALF_PTR;

#define MAXHALF_PTR 0x7fffffff
#define MINHALF_PTR 0x80000000
#define MAXUHALF_PTR 0xffffffff

#else /* FIXME: defined(_WIN32) */

typedef int INT_PTR, *PINT_PTR;
typedef long LONG_PTR, *PLONG_PTR;

typedef unsigned int UINT_PTR, *PUINT_PTR;
typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;

[...]
Lien ;)

Publié : jeu. 07/juin/2007 13:08
par Dr. Dri
le type int ne fait pas 64 bits sur une architecture 64 bits ?
(équivalent de long long int nan ?)

Dri

Publié : jeu. 07/juin/2007 13:17
par KarLKoX
En théorie, oui c'est le cas, pour gcc en tout cas mais en fait, ça dépend du compilo, exemple, chez kro$oft, faut obligatoirement passer par __int64 (long_ptr n'est qu'un typedef de ce type), va comprendre pourquoi ... :roll:

Publié : jeu. 07/juin/2007 20:59
par Flype
sinon, il y a une fonction IsWow64() de l'api windows pour savoir si le processus tourne en 32 ou 64bits (Windows Vista ou Windows XP) :

http://www.purebasic.fr/french/viewtopic.php?t=5325