IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Gestion des pointeurs entre Delphi 32b et Delphi 64b


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inc(longint(cc_),SIZE_OF_BEZIER_POINT);
    n'est pas accepté par le compilateur.

    le transcrire par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    la solution est pourtant simple, il suffit de typer les pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    procedure BezierForm();
    var u         : integer;
        choose    : array[0..Bezier_sz_dv_2] of BZ_Real; // extended
        pp_, cc_  : ^D_Bezier_Point;
        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
          xy := pp_^;
          xy[0] := xy[0] * choose[u];
          xy[1] := xy[1] * choose[u];
    	  cc_^ := xy;
    	  inc(cc_);
          inc(pp_);
          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;
    NB: dans les dernières versions il est aussi possible d'utiliser {$POINTERMATH ON} afin de pouvoir écrire pp_[x] pour accéder au xième point (un peu comme PChar = ^Char qui autorise les [])
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    J'avais déjà essayé cela sans succès...

    Depuis l'environnement du compilateur, avec la syntaxe "pointeurs typés" j'obtiens le message d'erreure suivante lors de l'execution de cette routine, si compilée en mode 64b

    Nom : pointer-32-64b-delphi.jpg
Affichages : 149
Taille : 314,4 Ko

    alors que si j'active dans la fenêtre de droite le mode 32b, l'execution se passe correctement et le programme fait ce qu'il doit.

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut 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!

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut TExtendedX87
    Merci!
    cela semble répondre à mon problème!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des classes entre elles et organisation.
    Par Hybrix dans le forum Développement 2D, 3D et Jeux
    Réponses: 54
    Dernier message: 29/08/2007, 19h54
  2. Réponses: 3
    Dernier message: 09/07/2007, 07h49
  3. Réponses: 8
    Dernier message: 03/07/2007, 09h11
  4. Gestion des erreurs entre sorties sans la STL
    Par Djobird dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/02/2007, 21h22
  5. Réponses: 4
    Dernier message: 04/07/2002, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo