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

Lazarus Pascal Discussion :

Problème de pointeur en passant de 32 à 64 bits


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Problème de pointeur en passant de 32 à 64 bits
    Bonjour à toutes et à tous,

    Dans un programme que j'ai écrit et qui fonctionnait bien en 32 bits, le transfert de message ne fonctionne plus en 64 bits. Voici le passage concerné :

    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
            begin
              with CoordZoom^ do
              begin
                if Pt0.X > Pt1.X then
                begin
                  Left:= Pt1.X; Right:= Pt0.X;
                end
                else
                begin
                  Left:= Pt0.X; Right:= Pt1.X;
                end;
                if Pt0.Y > Pt1.Y then
                begin
                  Top:= Pt1.Y; Bottom:= Pt0.Y;
                end
                else
                begin
                  Top:= Pt0.Y; Bottom:= Pt1.Y;
                end;
              end;
              PostMessage(Parent.Handle, cp_ZoomDemande, 0, LongInt(CoordZoom));
            end;
    avec :

    Quand j'en arrive à la ligne "PostMessage", aussi bien en 32 bits qu'en 64 bits, lorsque je pointe la souris sur "CoordZoom", un affichage me décrit son contenu de la même manière en donnant les valeur Left, Top, Right, Bottom de CoordZoom. C'est OK.

    Voici le passage traitant le message :

    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
    procedure TCadreAff.Zoomer(var message: TMsgZoom);
    var
      i: Integer;
    begin
      with message do
      begin
        Zooming.Down:= False;
        Zooming.Enabled:= False;
        for i:= 1 to NbEcransAff do
          EcranActif[i].ZoomPermis:= False;
        with Coord^ do
        begin
          if (Right-Left > 4) and (Bottom-Top > 4) then
            AffZoom(Left, Top, Right, Bottom);
        end;
      end;
    end;
    Avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TMsgZoom = record    {Type de message pour passer les coordonnées de zooming}
        Msg: Cardinal;
        Prm: Word;
        Coord: ^TRect;
      end;
    En 32 bits, lorsque j'arrive à la ligne "with Coord^ do", et que je pointe la souris sur "Coord", en 32 bits, je retrouve le valeurs postées alors qu'en 64 bits, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message.Coord = <TRECT> = nil
    Je n'arrive pas à trouver ce qu'il faut faire pour corriger ce problème.

    Merci de votre aide.

    Cordialement.

    Pierre.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Tu as deux problèmes.

    Le premier est que la taille des arguments de Send/PostMessage dépend de la plateforme et sont soit 32 soit 64 bits. Avec LongInt(CoordZoom) tu te limites au 32 bits. LPARAM(CoordZoom) pour supporter les deux.

    Le deuxième est lié ; la structure reçue est également dépendante de la plateforme et les données sont alignées sur 32 bits ou 64 bits (tu m'étonnes lorsque tu dis avoir des données corrects en 32 bits puisque l'alignement est faux aussi !).

    Pour supporter les deux plateformes, la structure devrait se présenter plus ou moins comme ceci :
    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
    TMsgZoom = record
      Msg: Cardinal;                    // 32 bits
      {$IFDEF CPUX64}
        Unused1: array[1..4] of Byte;   // 32 bits en complément en 64 bits
      {$ENDIF}
      Prm: Word;                        // 16 bits
      {$IFDEF CPUX86}
        Unused2: array[1..2] of Byte;   // 16 bits en complément en 32 bits
      {$ENDIF}
      {$IFDEF CPUX64}
        Unused2: array[1..6] of Byte;   // 48 bits en complément en 64 bits
      {$ENDIF}
      Coord: ^TRect;                    // 32 ou 64 bits
      Result: LRESULT;                  // 32 ou 64 bits
    end;
    En Delphi, ces alignements sont faits à travers TWordFiller et TDWordFiller qui sont eux-mêmes des records conditionnés. Peut-être existent-ils sous Lazarus ?

    J'attire encore ton attention sur le fait que PostMessage est asynchrone et que CoordZoom (un pointeur) doit être valide jusqu'au vidage de la pile. Donc attention où tu le déclares et surtout le libères

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci Andnotor pour cette proposition qui donne entière satisfaction en 32 et 64 bits.

    Je me doutais bien qu'il s'agissait d'un problème de taille de pointeur, mais je ne voyais pas comment le résoudre.

    LongInt que me proposes de remplacer par LPARAM, ne pose pas de problème car en CPU 32 bits, LongInt fait 32 bits et fait 64 bits en CPU 64 bits.

    Le problème était donc bien au niveau de TMsgZoom.

    Par ailleurs, une chose que je fais et qui ne doit certainement pas être orthodoxe est de déclarer : CoordZoom: ^TRect; sans autre forme de procès. Apparemment, dans les faits, cette manière de faire fait que ce pointeur existe en permanence (je n'utilise ni New ni Dispose).

    Cordialement.

    Pierre.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Citation Envoyé par ChPr Voir le message
    LongInt que me proposes de remplacer par LPARAM, ne pose pas de problème car en CPU 32 bits, LongInt fait 32 bits et fait 64 bits en CPU 64 bits.
    Une spécialité Lazarus alors ? Ca mériterait un petit contrôle par SizeOf(LongInt). Dans les faits, la taille d'un LongInt est toujours 32 bits sous Windows mais 32 ou 64 sous Linux.

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Une spécialité Lazarus alors ? Ca mériterait un petit contrôle par SizeOf(LongInt). Dans les faits, la taille d'un LongInt est toujours 32 bits sous Windows mais 32 ou 64 sous Linux.
    Tu as raison, en CPU 64 bits, SizeOf(LongInt) renvoie 32 bits. Pour autant, comment expliquer que si je laisse LongInt au lieu de LPARAM, cela fonctionne ?

    Cordialement.

    Pierre.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Le transtypage en LongInt va tronquer la valeur. Donc tant que l'adressage ne dépasse pas la limite de 232 -1 ça fonctionnera.

    Mais autant le faire correctement sous peine d'erreurs sporadiques difficile à trouver suivant les besoins (en mémoire) du projet

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Le transtypage en LongInt va tronquer la valeur. Donc tant que l'adressage ne dépasse pas la limite de 232 -1 ça fonctionnera.

    Mais autant le faire correctement sous peine d'erreurs sporadiques difficile à trouver suivant les besoins (en mémoire) du projet
    Ce doit être ça, mais tu as raison, plutôt prendre LPARAM qui fonctionnera toujours.

    Encore merci.

    Pierre.

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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