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

Langage Delphi Discussion :

Erreur (violation d'accès) dans une fonction typée


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 7
    Points
    7
    Par défaut Erreur (violation d'accès) dans une fonction typée
    Bonjour à tous

    Dans le code suivant, j'ai une classe avec deux fonctions : UN utilise une variable globale (cc) et DEUX utilise une variable (dd) de la classe.
    L'appel aux fonctions directes ne pose pas de problème.
    J'ai un tableau fct: array[1..2] of function : byte; que j'ai affecté dans le create fct[1]:=@TMaclasse.UN; fct[2]:=@TMaclasse.DEUX;.
    L'idée étant d'appeler des fonctions avec un indice (lui même calculé).
    L'appel aux fonctions indirectes ne pose pas de problème pour fct[1] mais j'ai une violation d'accès pour fct[2].
    Pistes de résolution explorées :
    - dans la fonction DEUX, c'est bien l'utilisation de la variable dd qui pose problème (problème de portée)
    - dans la fonction UN si j'enlève le résultat // result:=0; je n'ai plus d'erreur non plus ... curieux.
    Si dd est une variable globale ça marche, mais sans mon appli, il s'agit bien d'une variable de la classe.

    Voici le 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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TMaclasse = class
        dd:integer;
        fct: array[1..2] of function : byte;
        function UN : byte;
        function DEUX : byte;
        constructor create;
      end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      end;
     
    var Form1: TForm1;
        cc:integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var mc:TMaclasse;
         b:byte;
    begin
       mc:=TMaclasse.create;
       b:=mc.UN;      // ok
       b:=mc.DEUX;    // ok
       b:=mc.fct[1];  // ok
       b:=mc.fct[2];  // provoque une violation d'accès
       mc.free;
    end;
     
    { TMaclasse }
     
    constructor TMaclasse.create;
    begin
      fct[1]:=@TMaclasse.UN;
      fct[2]:=@TMaclasse.DEUX;
    end;
     
    function TMaclasse.UN: byte;
    begin
      inc(cc);
      showmessage('fonction UN   '+inttostr(cc));
      result:=0;         // pas d'erreur en supprimant cette ligne
    end;
     
    function TMaclasse.DEUX: byte;
    begin
      inc(dd);
      showmessage('fonction DEUX '+inttostr(dd));
      result:=0;
    end;
     
    end.
    J'avoue malgré la simplicité du code (réduit pour mettre le problème en évidence).
    Si vous avez une idée de solution, je suis preneur ... et également l'explication qu'en supprimant le résultat de la fonction UN, ça ne fait plus l'erreur.
    Je vous remercie d'avance pour vos retours.
    Jean-Michel

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Ce sont des méthodes d'objet, tu dois donc les déclarer comme telles (of object).

    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
    type
      TMyFunction = function : byte of object;
     
      TMaclasse = class
        fct: array[1..2] of TMyFunction;
        function UN : byte;
        function DEUX : byte;
        ...
      end;
     
    constructor TMaclasse.create;
    begin
      fct[1] := UN;
      fct[2] := DEUX;
    end;

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

Discussions similaires

  1. [AC-2003] Erreur incompatibilité de type : code SQL dans une fonction VBA
    Par KonTiKI dans le forum VBA Access
    Réponses: 5
    Dernier message: 18/04/2016, 17h15
  2. [JpGraph] Erreur avec le tableau dans une fonction
    Par gtraxx dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 12/01/2009, 21h01
  3. Réponses: 3
    Dernier message: 29/05/2007, 17h18
  4. Réponses: 1
    Dernier message: 02/08/2006, 17h37
  5. Réponses: 2
    Dernier message: 11/08/2004, 15h01

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