Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/02/2012, 15h11   #1
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 337
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 337
Points : 611
Points : 611
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 :
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 :
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 ;-)
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2012, 20h02   #2
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 456
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 456
Points : 688
Points : 688
Envoyer un message via ICQ à Ph. B.
Bonjour,

Vous êtes sur du code exemple transmis ?

Par exemple, la fonction DoPrint ne correspond pas au type attendu TEnumWordsCallback
Code :
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2012, 05h48   #3
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 337
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 337
Points : 611
Points : 611
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 :
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 :
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 :
 Found.Enum(TEnumWordsCallback(@DoPrint),M);
Ami calmant, J.P
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h11.


 
 
 
 
Partenaires

Hébergement Web