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

 Delphi Discussion :

Erreur dans fonction !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut Erreur dans fonction !
    Bonjour à toutes et à tous,

    Je suis en train de faire des tests avec ce code :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    unit U_Comparaison;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;
     
     
     
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        RichEdit1: TRichEdit;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
       class function Compare(aString1, aString2: string): TList<TDiff>;
     
      end;
     
     
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    type
       TDiff = record
         Character: Char;
         CharStatus: Char;  //Possible values: [+, -, =]
       end;
    TStringComparer = class
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       Differences: TList<TDiff>;
       Diff: TDiff;
     begin
       //Yes, I know...this method could be refactored ;-)
       Differences:= TStringComparer.Compare(Edit1.Text, Edit2.Text);
       try
         RichEdit1.Clear;
         RichEdit1.SelStart:= RichEdit1.GetTextLen;
         for Diff in Differences do
           if Diff.CharStatus = '+' then
           begin
             RichEdit1.SelAttributes.Color:= clBlue;
             RichEdit1.SelText := Diff.Character;
           end
           else if Diff.CharStatus = '-' then
           begin
             RichEdit1.SelAttributes.Color:= clRed;
             RichEdit1.SelText:= Diff.Character;
           end
           else
           begin
             RichEdit1.SelAttributes.Color:= clDefault;
             RichEdit1.SelText:= Diff.Character;
           end;
       finally
         Differences.Free;
       end;
     end;
     
     
    end;
     
    end.
    Et avec cette unité :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    unit StringComparison;
     
     interface
     
     uses
       Math, Generics.Collections;
     
     type
       TDiff = record
         Character: Char;
         CharStatus: Char;  //Possible values: [+, -, =]
       end;
     
       TStringComparer = class
       strict private
         type TIntArray = array of array of Integer;
         class function LCSMatrix(X, Y: string): TIntArray;
         class procedure ComputeDifferences(aLCSMatrix: TIntArray;
                                            X, Y: string;
                                            i, j: Integer;
                                            aDifferences: TList<TDiff>);
       public
         class function Compare(aString1, aString2: string): TList<TDiff>;
       end;
     
     implementation
     
     { TStringComparer }
     
     class function TStringComparer.LCSMatrix(X, Y: string): TIntArray;
     var
       m, n,
       i, j: Integer;
     begin
       m:= Length(X);
       n:= Length(Y);
     
       //We need one extra column and one extra row to be filled with zeroes
       SetLength(Result, m + 1, n + 1);
     
       //First column filled with zeros
       for i := 0 to m do
         Result[i, 0] := 0;
     
       //First row filled with zeros
       for j:= 0 to n do
         Result[0, j]:= 0;
     
       //Storing the lengths of the longest common subsequences
       //between prefixes of X and Y
       for i:= 1 to m do
         for j:= 1 to n do
           if X[i] = Y[j] then
             Result[i, j] := Result[i-1, j-1] + 1
           else
             Result[i, j]:= Max(Result[i, j-1], Result[i-1, j]);
     end;
     
     class procedure TStringComparer.ComputeDifferences(aLCSMatrix: TIntArray;
                                                        X, Y: string;
                                                        i, j: Integer;
                                                        aDifferences: TList<TDiff>);
     var
       CharDiff: TDiff;
     begin
       if (i > 0) and (j > 0) and (X[i] = Y[j]) then
       begin
         ComputeDifferences(aLCSMatrix, X, Y, i-1, j-1, aDifferences);
         CharDiff.Character:= X[i];
         CharDiff.CharStatus:= '=';   //The character did not change
         aDifferences.Add(CharDiff);
       end
       else
         if (j > 0) and ((i = 0) or (aLCSMatrix[i,j-1] >= aLCSMatrix[i-1,j])) then
         begin
           ComputeDifferences(aLCSMatrix, X, Y, i, j-1, aDifferences);
           CharDiff.Character:= Y[j];
           CharDiff.CharStatus:= '+'; //The character was added
           aDifferences.Add(CharDiff);
         end
         else if (i > 0) and ((j = 0) or (aLCSMatrix[i,j-1] < aLCSMatrix[i-1,j])) then
         begin
           ComputeDifferences(aLCSMatrix, X, Y, i-1, j, aDifferences);
           CharDiff.Character:= X[i];
           CharDiff.CharStatus:= '-'; //The character was removed
           aDifferences.Add(CharDiff);
         end;
     end;
     
     //This is a factory method
     class function TStringComparer.Compare(aString1, aString2: string): TList<TDiff>;
     var
       Matrix: TIntArray;
     begin
       Result:= TList<TDiff>.Create;
       Matrix:= LCSMatrix(aString1, aString2);
       ComputeDifferences(Matrix,
                          aString1, aString2,
                          Length(aString1), Length(aString2),
                          Result);
     end;
     
     end.
    J'obtiens une erreur à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public
        { Déclarations publiques }
       class function Compare(aString1, aString2: string): TList<TDiff>;
    Je ne vois pas la raison.

    Merci d'avance.

    @+,

    Cincap

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    Quelle est l'erreur ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ tourlourou, merci de ta réponse, voici l'erreur sous D6 et Seven 64bits :

    [Erreur] U_Comparaison.pas(18): ';' attendu(e) mais '<' trouvé(e)
    [Erreur] U_Comparaison.pas(19): (Type) attendu(e) mais 'END' trouvé(e)
    [Erreur] U_Comparaison.pas(33): Déclaration attendu(e) mais '<' trouvé(e)
    [Erreur] U_Comparaison.pas(47): ';' attendu(e) mais '<' trouvé(e)
    [Erreur] U_Comparaison.pas(48): Constante ou identificateur de type attendu
    [Erreur] U_Comparaison.pas(55): Opérateur non applicable à ce type d'opérande
    [Erreur] U_Comparaison.pas(56): 'THEN' attendu(e) mais identificateur 'CharStatus' trouvé(e)
    [Erreur] U_Comparaison.pas(59): Opérateur ou point-virgule manquant
    [Erreur] U_Comparaison.pas(61): 'THEN' attendu(e) mais identificateur 'CharStatus' trouvé(e)
    [Erreur] U_Comparaison.pas(64): Opérateur ou point-virgule manquant
    [Erreur] U_Comparaison.pas(69): Opérateur ou point-virgule manquant
    [Erreur] U_Comparaison.pas(70): Types incompatibles : 'Boolean' et 'procedure, untyped pointer or untyped parameter'
    [Erreur] U_Comparaison.pas(73): Expression attendu(e) mais 'END' trouvé(e)
    [Erreur] U_Comparaison.pas(74): Déclaration attendu(e) mais '<' trouvé(e)
    [Erreur] U_Comparaison.pas(77): '.' attendu(e) mais ';' trouvé(e)
    [Erreur] U_Comparaison.pas(18): Déclaration forward ou external non satisfaite : 'TStringComparer.Compare'
    [Erreur fatale] PComparaison.dpr(6): Impossible de compiler l'unité utilisée 'U_Comparaison.pas'
    Il y en a qui termine la class comme ceci, mais l'erreur persiste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class function Compare(aString1, aString2: string): TList<tdiff>;
    end;</TDiff>
    @+,

    Cincap

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Des types génériques (TList<TDiff>) avec Delphi 6 ?????

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Cl@udius, elle a l'air de fonctionner suivant son auteur :

    http://www.yanniel.info/2012/01/lcs-...in-delphi.html

    Maintenant faut voir avec D6 !

    @+,

    Cincap

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par cincap Voir le message
    Maintenant faut voir avec D6 !
    Avec D6 c'est tout vu malheureusement, les types génériques ont été introduits avec D2009.

    Il va falloir que tu remanies ce code pour transformer ce TList<> en un TList ou TObjectList "standard".

    @+

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

Discussions similaires

  1. [AC-2010] Erreur dans fonction sous Office10 et pas dans office xp
    Par Guy FALESSE dans le forum IHM
    Réponses: 25
    Dernier message: 28/09/2013, 09h48
  2. Catcher erreur dans fonction + AWK
    Par Moostiq dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 19/09/2011, 11h57
  3. Erreur dans fonction
    Par worldhugo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/06/2009, 11h29
  4. Erreur dans fonction FileTimeToLocalFileTime
    Par timotep dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/11/2007, 11h18
  5. [DEBUTANT][REGEX] erreur dans fonction
    Par TabrisLeFol dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 13h40

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