appel de Procedure de façon indexé

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

appel de Procedure de façon indexé

Message par pasbel »

Bonjour à tous

Ça va être compliqué à expliquer...
Je voudrais savoir s'il y aurait moyen d'appeler des Procedures par des appels indexés, par exemple j'ai une boucle for/next de 0 à 10, et je voudrais qu'à chaque incrémentation, une Procedure différente soit appelée, en utilisant l'index de la boucle, plutôt que d'utiliser ensuite des If/Endif ou Select ou autres pour tester ça ?
Pour l'exemple (qui ne marcherait pas) :
For a = 0 to 10
maProcedure-***-()
Next

a = 0 > maProcedure0()
a = 1 > maProcedure1()
...
a = 10 > maProcedure10()

Sinon, je passerai par une autre méthode plus longue ;-)
Avatar de l’utilisateur
Mindphazer
Messages : 760
Inscription : mer. 24/août/2005 10:42

Re: appel de Procedure de façon indexé

Message par Mindphazer »

Je ne sais pas si ça répond exactement à la problématique, mais tu peux stocker les adresses de tes procédures dans un tableau, puis utiliser CallFunctionFast()
un truc comme ça :

Code : Tout sélectionner

Procedure MaProcedure0()
  Debug "Procedure 0"
EndProcedure

Procedure MaProcedure1()
  Debug "Procedure 1"
EndProcedure

Procedure MaProcedure2()
  Debug "Procedure 2"
EndProcedure

; Tableau d'adresses de procédures
Global Dim ProcTable.i(2)

ProcTable(0) = @MaProcedure0()
ProcTable(1) = @MaProcedure1()
ProcTable(2) = @MaProcedure2()

For a = 0 To 2
  CallFunctionFast(ProcTable(a))
Next
Bureau : Win11 64bits
Maison : Macbook Pro M4 16" SSD 512 Go / Ram 24 Go - iPad Air 128 Go (pour madame) - iPhone 17 Pro Max 256 Go
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Je me posais la question après avoir fait le post, si cette méthode marcherait, ou avec une list.

Merci beaucoup à toi, je teste ça en rentrant.

Bon AM
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Je ne risquais pas de trouver sans connaitre l'instruction (j'ai cherché un truc sans succès) CallFunctionFast.
Sans l'avoir, j'aurais en plus tourner autour d'un tableau de données au format String.
Un Grand Merci !
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Du coup, je me suis rendu compte que ce n'était pas tout à fait ça dont j'avais besoin (mais ça me sera utile je crois plus tard).

En fait, avec ce système, je dois quand même créer ma liste d'appel, avant, vers les procedures, ou plutôt le tableau des appels de procedures.

Je souhaitais plutôt créer l'appel des procedures en générant leurs noms à la volée, toujours avec une boucle qui sert d'indexation.

Un truc du genre (j'invente le truc):

for i = 0 to 10
nomProcedure = "maProcedure" + str(i)
"une intruction qui permetrait de dire qu'on envoi la chaine comme appel de procedure à atteindre(nomProcedure)
next i

En fait le nombre pourrait varier, et c'est donc pour automatiser cela.
Je pense que je suis obligé de passer par la création de ce nom en String du coup.
Peut-être une instruction qui permettrait de transformer une donnée String en nom de variable ?
Ça permettrait de créer un tableau ou une liste à la voléé dans une boucle qui servirait d'indexation.
Je vais fouiner demain...

(le @procedure me rappelle le GFA sur Atari)
Avatar de l’utilisateur
case
Messages : 1566
Inscription : lun. 10/sept./2007 11:13

Re: appel de Procedure de façon indexé

Message par case »

avec une map ?

Code : Tout sélectionner

; creation des procedures
Procedure taratata0()
  Debug "execution de taratata0"
EndProcedure
Procedure taratata1()
  Debug "execution de taratata1"
EndProcedure
Procedure taratata2()
  Debug "execution de taratata2"
EndProcedure
Procedure taratata3()
  Debug "execution de taratata3"
EndProcedure
Procedure taratata4()
  Debug "execution de taratata4"
EndProcedure
Procedure turlututu0()
  Debug "execution de turlututu0"
EndProcedure
Procedure turlututu1()
  Debug "execution de turlututu0"
EndProcedure
Procedure turlututu2()
  Debug "execution de turlututu0"
EndProcedure
Procedure turlututu3()
  Debug "execution de turlututu0"
EndProcedure
Procedure turlututu4()
  Debug "execution de turlututu0"
EndProcedure


;creation de la map contenant les procedures (nom de la procedure comme cle, valeur contenant le pointeur)
NewMap procs.i()
procs("taratata0") = @taratata0()
procs("taratata1") = @taratata1()
procs("taratata2") = @taratata2()
procs("taratata3") = @taratata3()
procs("taratata4") = @taratata4()
procs("turlututu0")= @turlututu0()
procs("turlututu1")= @turlututu1()
procs("turlututu2")= @turlututu2()
procs("turlututu3")= @turlututu3()
procs("turlututu4")= @turlututu4()
;
  For z=0 To 100  ; appel 100 procedure aleatoirement
  If Random(1,0)=1        ; choisi aleatoirement la base du nom de la procedure.
     base$="taratata" 
   Else 
     base$="turlututu" 
   EndIf
   
   If FindMapElement(procs(),base$+Str(Random(4,1))) ; ajoute le numero de la procedure
     CallFunctionFast( procs()  )   ; appel la procedure
   EndIf
       Next


ImageImage
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Merci de ta réponse.
Je dois toujours créer ma liste avant, ce que je souhaite éviter, ou pouvoir automatiser la création de cette liste.

Mais la nuit porte conseil, pas encore appliqué mais j'ai la solution...

Je fais ma boucle qui crée mes noms indexés d'appel des procédures que j'écris dans un fichier include, et j'appelle ce fichier include au moment où j'en ai besoin

> création d'un fichier proc.pb
> for i = 0 to x
> proc$ = "procedure_" + str(i)
> ecriture de proc$ dans le fichier
>next i
>fermeture du fichier
>include proc.pb au moment voulu

On peut ainsi automatiser ou recréer dynamiquement les appels.
Je mettrai un exemple ici un peu plus tard
Mesa
Messages : 1151
Inscription : mer. 14/sept./2011 16:59

Re: appel de Procedure de façon indexé

Message par Mesa »

Peut-être avec runtime :
https://www.purebasic.fr/english/viewto ... 845a403472

Code : Tout sélectionner

Prototype Fonction()

  Runtime Procedure Fonction1()
      Debug "J'appelle la Fonction1 par son nom"; 
  EndProcedure

  Runtime Procedure Fonction2()
      Debug "J'appelle la Fonction2 par son nom"
  EndProcedure

  Procedure LancerProcedure(Nom.s)
      Protected ProcedureNom.Fonction = GetRuntimeInteger(Nom + "()")
      ProcedureNom()
  EndProcedure

  LancerProcedure("Fonction1") ; Affiche "J'appelle la Fonction1 par son nom"
  LancerProcedure("Fonction2") ; Affiche "J'appelle la Fonction2 par son nom"
  
 ;========================================================================= 
  
  Runtime Procedure calc1()  ; use the keyword Runtime in front
	ProcedureReturn 1
EndProcedure

Runtime Procedure calc2()  ; use the keyword Runtime in front
	ProcedureReturn 2
EndProcedure

Prototype.i calc()  ; define the prototype for calc1 and calc2
Define mycalc.calc

mycalc = GetRuntimeInteger("calc1()") ; ask for the procedure address of calc1()
Debug mycalc() ; call it

mycalc = GetRuntimeInteger("calc2()") ; ask for the procedure address of calc2()
Debug mycalc() ; call it
M.
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

J'ai vu ce post mais ça implique encore de créer une liste

Du coup, ce que je viens de faire :

Code : Tout sélectionner

Procedure myProc_0()
  Debug "Hello World 0"
EndProcedure

Procedure myProc_1()
  Debug "Hello World 1"
EndProcedure

Procedure myProc_2()
  Debug "Hello World 2"
EndProcedure

Procedure myProc_3()
  Debug "Hello World 3"
EndProcedure

If CreateFile(0, GetCurrentDirectory() + "myProcedure.pb")
  For a = 0 To 3
    WriteStringN(0, "myProc_" + Str(a) + "()")
    Debug a
  Next a
  CloseFile(0)
Else
  MessageRequester("Information","Impossible de créer le fichier!")
EndIf

Debug "file ok"

IncludeFile "myProcedure.pb"


Juste un petit/gros soucis :

- Quand j'utilise la fonction IncludeFile, si le fichier include n'existait pas, le programme ne crée même pas le fichier, il semble que l'appel IncludeFile passe avant le reste du programme, et du coup erreur ???
Si je supprime la fonction IncludeFile, le fichier include est toujours bien créé.
Je peux résoudre en créant au lancement du programme un fichier vide, mais c'est bizarre

- Si le fichier include existe déjà, et que j'ai changé le nombre de procedure en diminuant le nombre de boucle, le fichier est bien mis à jour, mais l'appel IncludeFile prend l'ancienne version, il semble ne pas cherger la nouvelle version du fichier, et à la seconde compilation, c'est bon ???

Par contre, une fois l'exe créé, pas de soucis.
Avatar de l’utilisateur
falsam
Messages : 7411
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: appel de Procedure de façon indexé

Message par falsam »

pasbel a écrit : mar. 19/mai/2026 9:56 Quand j'utilise la fonction IncludeFile, si le fichier include n'existait pas, le programme ne crée même pas le fichier
C'est normal. IncludeFIle n'a pas pour objectif de créer un fichier.

➡️ https://www.purebasic.com/french/docume ... ludes.html

👿 En principe tu ne devrais pas pouvoir compiler avec le code que tu proposes.
Tu dois obtenir le message "LIgne 29 : Fichier introuvable"

👍 Dans ton code tu crées le fichier "myProcedure.pb". Il est donc inutile de l'inclure dans ton exécutable
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Je crée le fichier juste au dessus...

Code : Tout sélectionner

If CreateFile(0, GetCurrentDirectory() + "myProcedure.pb")
  For a = 0 To 3
    WriteStringN(0, "myProc_" + Str(a) + "()")
    Debug a
  Next a
  CloseFile(0)
Else
  MessageRequester("Information","Impossible de créer le fichier!")
EndIf
Ensuite, j'appelle l'include créé juste avant

Code : Tout sélectionner

IncludeFile "myProcedure.pb"
Je pourrais aussi avec XIncludeFile "myProcedure.pb", mais le résultat est le même.

Tu peux faire l'essai en supprimant cette ligne, le fichier est bien crée.
Tu remets la ligne et tu relances, tu verras qu'il lit bien le fichier créé avant.
Si tu modifie ensuite la boucle en a = 0 to 2, le fichier myProcedure.pb est bien modifier, mais l'appel de l'include ne tiens pas compte de cette modification, à la seconde compilation, oui.

D'après moi, le compilateur cherche en premier tous les includes dans le code, et vérifie que ces fichiers existent, et les charge le cas échéant.
Ensuite, la compilation démarre.

Ce qui explique :
- si mon fichier n'existe pas, j'ai un message d'erreur.
- si mon fichier existe, il charge le fichier et le met dans le code
- si mon fichier existe, mais que j'ai modifié mon programme afin de changer la structure de l'include, le compilateur a chargé avant la version précédente et compile ensuite, donc crée à ce moment la nouvelle version de l'include, mais celle-ci n'est pas prise en compte.
Si je lance une seconde compilation sans changer mon code, il prendra le bon fichier.

Du coup, ça n'arrange pas mes affaires... je vais regarder si il y a des options de compilation...
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

Il faut que j'approfondisse avec le Runtime que je ne connaissais pas et donc ne maitrise pas.
Avatar de l’utilisateur
falsam
Messages : 7411
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: appel de Procedure de façon indexé

Message par falsam »

Mon message précédent aurait il été mal compris 🤔
Ou alors, aurais je mal compris la demande 🤪
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
pasbel
Messages : 49
Inscription : mer. 10/avr./2019 17:36

Re: appel de Procedure de façon indexé

Message par pasbel »

J'ai juste du mal à expliquer ce que je veux faire, donc difficile d'y amener des réponses.
Au contraire, merci pour les réponses. ;-)

Pour le Runtime, j'ai regardé, pas possible pour ce que je veux faire.

J'ai changé de tactique, je n'en étais pas loin, mais pas possible semble-t-il.

Je vois peut-être trop loin par rapport à mon expérience.

J'ai fait un petit programme qui crée d'abord mon fichier include.
Ensuite mon "vrai" programme appellera cet include, je pense que c'est plus simple.
Je voulais tout automatiser, et que la base soit construite toute seule, pour ce programme, éventuellement pour tous les programmes avenir, si j'en fait.
Mais je vais perdre plus de temps ainsi.

Le but est aussi d'apprendre, de se torturer l'esprit, c'est aussi un peu ça le but du jeu.

Merci beaucoup pour ton intérêt et tes réponses.

J'ai découvert le truc des fichiers Include il n'y a que quelques jours, ça éclairci bien le listing du programme principale, et une fois qu'ils sont créés et carrés, on peut les utiliser à nouveau pour d'autres programmes.

Pour l'anecdote, j'ai fait mon tout premier programme sur une "armoire normande" avec de grandes "bobines", le résultat était sorti sur cartes perforées. Mon père m'avait emmené à sont boulot un samedi, chez CII (CII Homewell Bull, puis Bull). J'avais peut-être 10 ou 12 ans.

Encore merci pour tes réponses
Avatar de l’utilisateur
falsam
Messages : 7411
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: appel de Procedure de façon indexé

Message par falsam »

pasbel a écrit : mar. 19/mai/2026 7:58 Je fais ma boucle qui crée mes noms indexés d'appel des procédures que j'écris dans un fichier include, et j'appelle ce fichier include au moment où j'en ai besoin
A partir du moment ou tu écris tes noms de procédures dans un fichier, ça ne sert à rien d'utiliser include ou xinclude pour faire appel à ce fichier quand tu en as besoin.
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre