Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre du Club
    Inscrit en
    octobre 2006
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 122
    Points : 59
    Points
    59

    Par défaut Affecter une procédure à une variable

    Bonjour à tous,

    Est-il possible d'affecter une procédure à une variable de manière à pouvoir réaliser des constructions de ce type:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PROCEDURE hello;
    BEGIN
      WRITELN('Hello')
    END;
     
    PROCEDURE repeter(action: procedure;n: INTEGER)
    VAR
      i: INTEGER;
    BEGIN
      FOR i:=1 TO n DO action
    END;
     
    BEGIN
      repeter(hello,3)
    END.
    Et sinon, quelle solution permettrait d'aboutir au même résultat ?

    Merci d'avance,

    Gauthier

  2. #2
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 544
    Points : 15 826
    Points
    15 826

    Par défaut

    oui mais sous cette forme (pour Delphi)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    program Project1;
     
    {$apptype console}
     
    type
      tprocedure = procedure;
     
    PROCEDURE hello;
    BEGIN
      WRITELN('Hello')
    END;
     
    PROCEDURE repeter(action: tprocedure;n: INTEGER);
    VAR
      i: INTEGER;
    BEGIN
      FOR i:=1 TO n DO action
    END;
     
    BEGIN
      repeter(hello,3);
      readln;
    END.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  3. #3
    Membre du Club
    Inscrit en
    octobre 2006
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 122
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    oui mais sous cette forme (pour Delphi)
    Merci pour cette piste. Je suis sous FreePascal, et en cherchant dans la doc, ça m'a amené aux «types procéduraux», sur base de quoi j'ai trouvé ce qui suit. Il semble donc qu'une procedure doive d'abord être affectée à une variable de type procedure avant que cette variable - elle - puisse être passée en argument à une autre.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    PROGRAM test;
    TYPE
      Tproc = PROCEDURE;
     
    PROCEDURE hello;
    BEGIN
      WRITELN('Hello')
    END;
     
    PROCEDURE repeter(action: tproc;n: INTEGER);
    VAR
      i: INTEGER;
    BEGIN
      FOR i:=1 TO n DO action
    END;
    VAR
      thello: Tproc;
    BEGIN
      thello := @hello;
      repeter(thello,3)
    END.
    Merci,

    Gauthier

  4. #4
    Membre du Club
    Inscrit en
    octobre 2006
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 122
    Points : 59
    Points
    59

    Par défaut Affecter une procédure avec paramètres à une variable

    Bonjour à tous,

    Dans un message précédent, je pensais avoir trouvé une solution au fait de passer une procédure comme paramètre à une autre. Malheureusement, ça ne semble pas fonctionner pour des procédures demandant des paramètres.

    Par rapport à l'exemple précédent, j'ajoute une procédure helloqui, et bien que j'utilise exactement la même syntaxe, je reçois ce message d'erreur:

    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
    PROGRAM test;
    TYPE
      Tproc = PROCEDURE;
     
    PROCEDURE hello;
    BEGIN
      WRITELN('Hello')
    END;
     
    PROCEDURE helloqui(s: STRING);
    BEGIN
      WRITELN('Hello ,',s)
    END;
     
    PROCEDURE repeter(action: tproc;n: INTEGER);
    VAR
      i: INTEGER;
    BEGIN
      FOR i:=1 TO n DO action
    END;
    VAR
      thello, thelloqui: Tproc;
      s: STRING;
    BEGIN
      thello := @hello;
      thelloqui := @helloqui;
      repeter(thello,3);
      repeter(thelloqui('Monsieur'),3);
    END.
    Code :
    1
    2
    3
    repeter.pas(25,16) Error: Incompatible types: got "<address of procedure(ShortString);Register>" expected "<procedure variable type of procedure;Register>"
    repeter.pas(31) Fatal: There were 1 errors compiling module, stopping
    Fatal: Compilation aborted
    Est-ce quelqu'un a une explication et une solution ? Je rappelle que j'utilise FreePascal.

  5. #5
    Rédacteur
    Avatar de darrylsite
    Inscrit en
    juillet 2007
    Messages
    1 300
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 1 300
    Points : 2 210
    Points
    2 210

    Par défaut

    Il vous faut utiliser des types convenables.
    Une procédure de type
    Code :
    1
    2
     
    Type tproc = Procedure;
    ne peux pas être affectée à une procédure de type
    Code :
    1
    2
     
    Type tproc2 = procedure(param : String);
    ces deux types ne sont pas compatibles

  6. #6
    Membre du Club
    Inscrit en
    octobre 2006
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 122
    Points : 59
    Points
    59

    Par défaut Merci

    Je vais tester ça

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •