Gestion des pointeurs entre Delphi 32b et Delphi 64b
Jusqu'à présent j'ai utilisé delphi pour générer des applications 32b.
par exemple j'utilise fréquement le code suivant dans le cadre de fonctions de Bézier ceci sans problème depuis au moins delphi7.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
procedure BezierForm();
var u : integer;
choose : array[0..Bezier_sz_dv_2] of BZ_Real; // extended
pp_, cc_ : pointer;
xy : D_Bezier_Point; //type record x,y : extended end;
_up : Boolean;
begin
cc_:=_Bezier_Buffers(1); // [n][1];
pp_:=_Bezier_Buffers(0); // [n][0];
Choose[0]:=1;
u:=0;
_up:=true;
repeat
move(pp_^,xy,SIZE_OF_BEZIER_POINT);
xy[0] := xy[0] * choose[u];
xy[1] := xy[1] * choose[u];
move(xy,cc_^,SIZE_OF_BEZIER_POINT);
inc(longint(cc_),SIZE_OF_BEZIER_POINT);
//cc_ := PAnsiChar(cc_) + SIZE_OF_BEZIER_POINT;// constante = sizeof(D_Bezier_Point)
inc(longint(pp_),SIZE_OF_BEZIER_POINT);
//pp_ := PAnsiChar(pp_) + SIZE_OF_BEZIER_POINT;
if _up then
begin
if u < Bezier_sz_dv_2 then
begin
inc(u);
choose[u] := choose[u-1] * (Bezier_sz_-u) / u;
_up:=u < Bezier_sz_dv_2;
end;
end
else
dec(u);
until u < 0;
end; |
en essayant de générer une application 64b sous RAD 10.1 V2, l'ordre
Code:
1 2
|
inc(longint(cc_),SIZE_OF_BEZIER_POINT); |
n'est pas accepté par le compilateur.
le transcrire par
Code:
cc_ := PAnsiChar(cc_) + SIZE_OF_BEZIER_POINT;
comme suggéré dans un des help du compilateur permet de compiler le code mais il génère une erreur "overflow" à l'execution. L'utilisation de PByte ne change rien au comportement.
Je remercie par avance toutes réponses me permettant de débloquer la situation!
Le problème persiste mais l'origine est autre: type EXTENDED!
Après avoir comparé ce qui se passe entre window 32 et window 64b, il apparait que le problème ci-dessus provient du fait que:
1- sous window32b, le type extended occupe 10 bytes
2- sous window 64b le même type n'occupe que 8 bytes et semble apparenté au type double.
de ce fait certaines multiplications conduisent à un overflow. que l'on peut reproduire à l'identique en window32b si je substitue double à extended.
la question est donc reformulée en:
existete-t-il un type similaire à "extended sous 32b" dans la version 64b? la seule chose que j'ai trouvé est le type "TExtended80Rec" mais qui ne convient pas
merci pour vos réponses!