Longueur des types delphi [Résolu]

Signaler
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
-
Messages postés
1
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
7 septembre 2009
-
Bonjour à tous

Avec un programme en C++ Builder je dois lire et modifier des fichiers binaires générés à partir d'un programme écrit en delphi. Je connais la structure de l'enregistrement delphi mais je ne trouve pas les types correspondants en c++...Du coup mon buffer n'a pas la bonne longueur...

Ma question est : quelle est la longueur en octets des types utilisés en delphi et leur équivalence éventuelle en C++:

en pascal (delphi) :       en C++ (builder)
machin : string[40]          char machin[40] ? char machin[41] ?
bool                               bool ? int ?...
boolean                          ??
integer                            int ? long ? ...
byte                                byte ? int ? ...
TRect                             TRect ?

Ca peut intéresser d'autres gars dans mon cas ou dans le cas inverse aussi d'ailleurs, alors si vous connaissez un lien vers un bon tuto sur les conversions c++ builder, delphi je prends aussi !

PS : merci de ne pas me renvoyer sur cppfrance J'en viens.

A+

6 réponses

Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut,

d' après l' aide de Delphi :

les types entiers :
Shortint    -128..127    signed 8-bit
Smallint    -32768..32767    signed 16-bit
Longint    -2147483648..2147483647    signed 32-bit
Int64    -2^63..2^63-1    signed 64-bit
Byte    0..255    unsigned 8-bit
Word    0..65535    unsigned 16-bit
Longword    0..4294967295    unsigned 32-bit

les floats:
Real48    2.9 x 10^-39 .. 1.7 x 10^38    11-12    6
Single    1.5 x 10^-45 .. 3.4 x 10^38    7-8    4
Double    5.0 x 10^-324 .. 1.7 x 10^308    15-16    8
Extended    3.6 x 10^-4951 .. 1.1 x 10^4932    19-20    10
Comp    -2^63+1 .. 2^63 -1    19-20    8
Currency    -922337203685477.5808.. 922337203685477.5807    19-20    8

Pour les booleans, 1 bit suffit. Les strings dépendent de leur taille.

En ce qui concerne le TRect, il s' agit d' une structure de données.
Je pense qu' il faudrait voire avec celui qui a fait le programme sous Delphi.
Par tatonnement, on y arrive aussi (si on sait quelles sont les valeurs que l' on doit récupérer)!

A+
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Merci Mauricio

Pour ta réponse trés complète. En plus j'ai les capacités

J'ai pu recontacter le développeur

bool             4 octets
boolean       1 octet  (idem c++builder)
integer         4 octets (idem c++builder)
byte             1 octet (idem c++builder)
TRect          16 octets (idem c++builder), la structure est la même...

chaine[n]      n+1 octets (premier char contient la longueur sur un octet), donc petites fonctions à prévoir...

Avec ça  je devrais pouvoir caler mon buffer sur le sien

A+
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Content d' avoir pû t' aider,

Un peu louche quand même :
bool             4 octets
boolean       1 octet  (idem c++builder)

Le plus simple, pour voir si tu récupères les bonnes valeurs, c' est de lira un fichier binaire dont tu connais les valeurs à importer ...

A+
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
40
Salut,

ça surprend un Boolean sur 4 octets !
mais c'est tout ce qu'il y a de plus juste
Bool étant de Type LongBool

Sinon pour connaitre la taille des différents types il est plus simple
de faire un SizeOf :

SizeOf(Bool)  >> renvoi 4
SizeOf(Boolean) >> renvoi 1

 
@+
Cirec

<hr siz="" />
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009

Salut

Il faut faire aussi attention à l'alignement des données dans les options avancées du compilateur.
Le plus rationnel étant un alignement byte, à mon avi, ou 1 byte prend...1 octet

(appelons un chat un chat)

Par tatonnement j'ai du passer en "double word" pour avoir la bonne longueur de types dans mon buffer...

Par contre un booléen sur 4 octets alors que théoriquement 1 bit suffit ???
kesako ?

A+
Messages postés
1
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
7 septembre 2009

pourquoi 4 bytes pour un booléan ?
les compilateurs actuels travaillent plus vite sur des "integer"
et de toutes façons chargent un integer même pour travailler sur un bit