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 avec TParser10 [Lazarus]


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 avec TParser10
    Bonjour à toutes et à tous,

    A ceux qui connaissent l'éditeur/résolveur d'équation à l'exécution : TParser http://delphi.icm.edu.pl/ftp/d10free/parser10.zip

    Je souhaite utiliser une des fonctions avancées de ce Parser qui est le traitement d'une fonction prédéfinie via l'instruction : AddFunctionOneParam ou AddFunctionTwoParam.

    Sous Delphi6, j'ai le code suivant qui se compile :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Parser10, StdCtrls;
     
    type
      TUneFonction = procedure (Ope: POperation) of object;
     
      TForm1 = class(TForm)
        Button1: TButton;
        Parser1: TParser;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        MonOpe: TOperation;
        UneFonction: TUneFonction;
        procedure MaFonction(Ope: POperation);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.MaFonction(Ope: POperation);
    begin
      with Ope^ do
      begin
        Dest^:= Sin(Arg1^)*Cos(Arg2^);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      UneFonction:= MaFonction;  {PB1}
      Parser1.AddFunctionTwoParam('MaFonction', @UneFonction);  {PB2}
      Parser1.Expression:= 'MaFonction';
      Edit1.Text:= FloatToStr(Parser1.Value);
    end;
     
    end.
    Cela ne se compile pas sous Lazarus. A la ligne marqué PB1 il faut que je remplace ""MaFonction" par "@MaFonction". Mais alors, le problème se reporte à la ligne suivante et que j'enlève ou laisse l"@" deant "UneFonction", ça bug toujours.

    Je tourne en rond et ne sais plus quoi faire.

    Merci de votre aide.

    Pierre

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pointeur de fonction attendus et tu envois un pointeur de méthode.
    logique que ça ne passe pas.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Parser10, StdCtrls;
     
    type
      TFunction = procedure(aOperation: POperation);
     
      TForm1 = class(TForm)
        Button1: TButton;
        Parser1: TParser;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        fOperation : TOperation;
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    uses Math;
     
    procedure MyFunction(aOperation: POperation);
    begin
      aOperation^.Dest^ := Sin(aOperation^.Arg1^)*Cos(aOperation^.Arg2^);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     
      Parser1.AddFunctionTwoParam('MyFunction', @MyFunction); 
      Parser1.Expression := 'MyFunction';
     
      Edit1.Text := FloatToStr(Parser1.Value);
    end;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  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
    Oui, merci Dr Who, de me le rappeler, c'est mon erreur (ce n'est pas la première fois que cela m'arrive). Faut que je me burine ça dans la tête.

    Cordialement.

    Pierre

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    bah alors!

    t'inquiète pas, ça arrive même aux meilleurs d'entre nous.
    et comme les cas de passage de fonctions en arguments sont assé rare ou trop peu souvent mis en pratique ... ceci explique cela.

    à partir de D2007 et probablement D2006 on peux faire 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    program Project16;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils, Classes, Windows;
     
    type
      // simple function
      TFunction    = function(A, B: integer): integer;
     
      // only with D2009+
      TRefFunction = reference to function(A, B: integer): integer;
     
      TMaClasse = class
      public
        // only with D2007+
        class function F(A,B: integer): integer; static;
      end;
     
     
    class function TMaClasse.F(A, B: integer): integer;
    begin
      result := A + B;
    end;
     
    // simple function
    function XF(A, B: integer): integer;
    begin
      result := A * B;
    end;
     
     
    // caller for "reference to" functions
    procedure RefCallCalcAB(aFunction: TRefFunction; const A, B: integer);
    begin
      writeln(aFunction(A, B));
    end;
     
    // caller for simple function 
    procedure CallCalcAB(aFunction: TFunction; const A, B: integer);
    begin
      Writeln(aFunction(A, B));
    end;
     
    var
      Cl : TMaClasse;
    begin
      // can call all functions
      RefCallCalcAB(XF, 10, 20); // 200
     
      // can call only simple function 
      CallCalcAB(XF, 10, 20); // 200
     
      Cl := TMaClasse.Create;
      try
        RefCallCalcAB(CL.F, 10, 20); // 30
     
        // Compiling ok if CL.F is class function static.
        CallCalcAB(CL.F, 10, 20); // 30
     
        ReadLn;
      finally
        Cl.Free;
      end;
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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