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 :

Conversion Delphi -> Lazarus : problème avec callback [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 186
    Par défaut Conversion Delphi -> Lazarus : problème avec callback
    Bonjour,
    j'ai fait une conversion d'un projet Delphi en projet Lazarus sous Windows. Tout s'est bien passé à part que j'ai un Sigsegv pendant l'appel d'une fonction en callback. Je suis en "Mode Delphi" dans les .pas
    Voici des extraits du code qui me pose souci :
    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
     
     
    procedure TForm1.Button6Click(Sender: TObject);
     
      function DoPrint(M: TMemo; Word: PChar; WordLength: Integer): Boolean;
      begin
        Result := False;
        M.Lines.Add(Word);
      end;
     
     
    var
      Found: TDawg;
      T: Int64;
    begin
     
      Found := TDawg.Create;
      try
        T := PerfCounter;
     
        FDawg.SearchCombinatoric(Edit2.Text, Found, StrToInt(Edit4.Text));
     
        T := PerfCounter - T;
        M.Lines.Add(Time(T));
        M.Lines.Add(IntToStr(Found.Count) + 'combinaisons trouvées' +
                    ' Longueur Max: ' + InttoStr(Found.Maxlen) );
        T := PerfCounter;
        if CB2.Checked then // anzeige
          Found.Enum(@DoPrint, M);
             T := PerfCounter - T;
        M.Lines.Add(Time(T));
      finally
        Found.Free;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     TEnumWordsCallback = function(UserData: Pointer; Word: PChar; WordLength: Integer): Boolean; 
    function TDawg.Enum(Callback: TEnumWordsCallback; UserData: Pointer): String;
    .....
          if Callback(UserData, PChar(Word), StackPos)
    .....
    Le souci c'est au niveau du callback : les paramètres ne sont pas bien passés à la fonction DoPrint. Je ne retrouve pas ce que je passe.

    Quelqu'un a-t-il une idée de ce qui peut clocher ? Merci d'avance.
    Ami calmant, J.P ;-)

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,

    Vous êtes sur du code exemple transmis ?

    Par exemple, la fonction DoPrint ne correspond pas au type attendu TEnumWordsCallback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TEnumWordsCallback = function(UserData: Pointer; Word: PChar; WordLength: Integer): Boolean;
    //...
    function DoPrint(M: TMemo; Word: PChar; WordLength: Integer): Boolean;
    Ensuite, j'éviterais les noms de variable correspondant à un mot-clé comme Word.

    --
    Philippe.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 186
    Par défaut
    Bonjour,
    merci Philippe pour la réponse. Effectivement le code en Delphi n'est pas de moi et il y a certaines parties du code qui ne sont pas très propres.
    Finalement je m'en suis sorti :
    1 - en me mettant en mode objFpc dans l'unité qui gère l'IHM
    2 - en mettant la fonction DoPrint à l'extérieur de la fonction du click button6
    3 - Comme le suggérait Philippe, en mettant le type TEnumWordsCallback en phase avec la fonction DoPrint (Delphi semble plus tolérant).
    4 - En créant une variable intermédiaire (proc) de type TEnumWordsCallback

    Voici ce que cela donne :
    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
      {$MODE ObjFpc }  
    ...
    function DoPrint(M: TMemo; Word: PChar; WordLength: Integer): Boolean;
      begin
        Result := False;
        M.Lines.Add(Word);
      end;
    procedure TForm1.Button6Click(Sender: TObject);
    var
      Found: TDawg;
      proc: TEnumWordsCallback;
      T: Int64;
    begin
      Found := TDawg.Create;
       try
        T := PerfCounter;
     
        FDawg.SearchCombinatoric(Edit2.Text, Found, StrToInt(Edit4.Text));
     
        T := PerfCounter - T;
        M.Lines.Add(Time(T));
        M.Lines.Add(IntToStr(Found.Count) + ' combinaisons trouvées' +
                    ' Longueur Max: ' + InttoStr(Found.Maxlen) );
        T := PerfCounter;
        proc := @DoPrint;
        if CB2.Checked then // anzeige
         Found.Enum(proc,M);
     
             T := PerfCounter - T;
        M.Lines.Add(Time(T));
      finally
        Found.Free;
      end;                     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
     TEnumWordsCallback = function( UserData: TMemo; Word: PChar; WordLength: Integer): Boolean;  
    ...
    oops je viens de m'apercevoir que l'on pouvait se passer de la variable proc en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Found.Enum(TEnumWordsCallback(@DoPrint),M);
    Ami calmant, J.P

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/11/2007, 17h53
  2. [Lazarus] Problème avec Tbrush.style
    Par christophe D dans le forum Lazarus
    Réponses: 2
    Dernier message: 08/06/2006, 13h12
  3. Problème avec EInOutError sous delphi 2005
    Par Teb dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2005, 11h48
  4. [Delphi 2005] : Problème avec MessageDlg.....
    Par babyface dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2005, 12h07
  5. [Delphi 3] Problème avec fichier ressource .RES
    Par delphim dans le forum EDI
    Réponses: 2
    Dernier message: 28/06/2005, 18h11

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