Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/05/2011, 10h56   #1
gvdmoort
Membre du Club
 
Inscription : octobre 2006
Messages : 114
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 114
Points : 52
Points : 52
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
gvdmoort est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 15h46   #2
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 395
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 395
Points : 10 736
Points : 10 736
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/05/2011, 16h20   #3
gvdmoort
Membre du Club
 
Inscription : octobre 2006
Messages : 114
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 114
Points : 52
Points : 52
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
gvdmoort est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 13h57   #4
gvdmoort
Membre du Club
 
Inscription : octobre 2006
Messages : 114
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 114
Points : 52
Points : 52
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.
gvdmoort est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 00h38   #5
darrylsite
Rédacteur
 
Avatar de darrylsite
 
Inscription : juillet 2007
Messages : 1 296
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 1 296
Points : 1 922
Points : 1 922
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
darrylsite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h36   #6
gvdmoort
Membre du Club
 
Inscription : octobre 2006
Messages : 114
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 114
Points : 52
Points : 52
Par défaut Merci

Je vais tester ça
gvdmoort est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h29.


 
 
 
 
Partenaires

Hébergement Web