Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Simulation de passage de tableau à un sous-programme | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Simulation de passage de tableau à un sous-programme Mar 21 Nov 2023 - 2:19 | |
| Bonjour / Bonsoir les amis. Je soumets à votre sagesse un sujet de discussion sur la possibilité de simuler le passage d'un tableau à un sous-programme panoramic du genre (SUB / FNC). Si l'astuce dont je parle dans le code suivant s'avère bonne (et non une fausse bonne astuce), on pourrait même s'affranchir de la limitation à 6 paramètres dans les appels à des fonctions dans les DLL. Au lieu de - Code:
-
ret% = dll_call6("blabla",param1,param2,param3,param4,param5,param6)
On fera : - Code:
-
ret% = dll_call1("blablabla",adr(st$))
avec st$ une chaine contenant le nombre de paramètres (disons 3 ou même 14) suivi des identificateurs des paramètres. La fonction "blablabla" traitera la chaine st$ pour en extraire les différents paramètres et fera un appel à la fonction adéquate en lui transmettant les paramètres. Bon, j'admets que c'est une gymnastique de programmation, mais si ça marche why not ? Voici le code exemple. Comme d'habitude tout y est . - Code:
-
rem ============================================================================ rem Simulation de transmission par valeur d’une variable de type tableau() rem comme paramètre à un sous-programme (SUB / FNC) rem ============================================================================ rem Rappel rem 1 / Panoramic ne permet pas le passage de variables de type tableau rem 2 / Les valeurs des paramètres transmis par valeur (le seul compris par rem Panoramic) à un sous-programme (SUB ou FNC) NE SONT PAS MODIFIEES par rem l’exécution du s/p rem ============================================================================ rem L’astuce consiste à transmettre une chaine (string) qui contiendra les valeurs rem du tableau tablo(n) rem ============================================================================ rem Si cette astuce s’avère bonne, on pourrait l’appliquer aux appels des rem fonctions dans les DLL en contournant la limite de 6 paramètres. rem Quelque chose comme : rem ret% = dll_call1("blabla",adr(st$)) rem st$ contiendra le nombre de paramètres suivi des identificateurs des paramètres rem Par exemple pour 8 paramètres rem st$ = "8,x1,y1,x2,y2,x3,y3,x4,y4" rem La fonction "blabla" traitera la chaine st$ pour extraire les différents rem paramètres puis appellera la fonction (dans le code de la DLL) en lui rem transmettant les 8 paramètres. ' ------------------------------------------------------------------------------ rem Exemple de simulation de passage d’un tableau à une FNC ' ------------------------------------------------------------------------------ dim n : ' dimension du tableau n = 10 : ' 10 dans cet exemple dim tablo(n) : ' on déclare un tableau de dimension n dim st$ : ' string qui contiendra les valeurs du tableau tablo(n) : ' à transmettre comme paramètre au lieu du tableau à la fonction : ' FNC Calcul_Moyenne(st$), simulant ainsi le passage par valeur : ' d'un tableau dim i : ' compteur ' ------------------------------------------------------------------------------ data 1,12,18,15,16,20,7,11,9,10 : ' le contenu du tableau tablo ' ------------------------------------------------------------------------------ ' initialisation du tableau tablo(n) tablo(0) = n : ' l'indice zéro contient la dimension du tableau for i = 1 to n : read tablo(i) : next i
' initialisation de la variable string st$ st$ = str$(n) + "," for i = 1 to n : st$ = st$ + str$(tablo(i)) + "," : next i
' ============================================================================== ' Maintenant st$ contient la dimension du tableau tablo (n=10) suivie des valeurs ' du tableau. ' En tout, ce sont 11 valeurs separées par des virgules. ' Dans notre exemple ce sont : 10,1,12,18,15,16,20,7,11,9,10, ' Notez la présence de la virgule finale. ' ------------------------------------------------------------------------------ ' On désire écrire un s/p de type FNC qui retournera le calcul de la moyenne des ' 10 valeurs du tableau. ' Comme le passage d'une variable de type tableau comme paramètre à un s/p ' n'est pas possible en Panoramic, on transmet à la place notre chaine st$. ' C'est dans le s/p qu'on récupera le tableau. ' ------------------------------------------------------------------------------ ' Appel à la fonction, le paramètre st$ simule tablo(10) print "Moyenne = " ; Calcul_Moyenne(st$) end rem ============================================================================ ' st$ simule le tableau tablo(10) ' dans cet exemple : st$ = "10,1,12,18,15,16,20,7,11,9,10," FNC Calcul_Moyenne(st$) dim_local n,virgule,v,i,moyenne virgule = instr(st$,",") : ' 3ème position dans notre exemple n = val(left$(st$,virgule - 1)) : ' on récupère 10 la dimension du tableau dim_local t(n) : ' on déclare un tableau t(n) miroir du tableau tablo(n) for i = 1 to n v = virgule : ' on sauvegarde la position de la virgule virgule = instr_pos(st$,",",v+1) : ' on cherche la position de la prochaine virgule t(i) = val(mid$(st$,v+1,virgule-1-v)) : ' on reconstitue le tableau next i ' Maintenant tout se passe comme si on a transmis notre tableau tablo(10) ' Traitements divers exécutés par le S/P ' Ici un simple calcul for i = 1 to t(n) : moyenne = moyenne + t(i) : next i result moyenne / n END_FNC rem ============================================================================
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mar 21 Nov 2023 - 10:11 | |
| Oui, Papydall, ça marchera. Tu peux même étendre le principe pour passer les paramètres "par référence", ce qui permettra au sousprogramme de modifier les paramètres. Il suffit de passer str$(adr(variable$)) pour informer le sousprogramme de l'endroit où se trouvent mes données, et même en passant une information concernant le type de variable (entier, flottant ou string) pour que le sousprogramme sache comment gérer cette adresse. Exemple: - Code:
-
dim prix, quantité%,libelle$,clients$(10), param$ param$ = "4,F"+str$(adr(prix))+","+"I"+str$(adr(quantite%))+","+"S"+str$(adr(libelle$))+","+"A11S"+str$(adr(clients$))
La première valeur (4) représente le nombre de paramègtres passés. Dans cet exemple, les préfixes des adresses ont la signification (évidente) suivante: F = flottant (float) I = entier (integer) S = texte (string) AnF = tableau de flottants (array of float), n = nombre d'éléments AnI = tableau de entiers (array of iinteger), n = nombre d'éléments AnS = tableau de texte (array of string), n = nombre d'éléments Dans un sousprogramme appelé par DLL_CALLx, il est facile de décoder cela. Et même dans un SUB ou FNC, il est facile de traiter cela et de gérer chaque paramètre selon ses caractéristiques... Tout est accessible en Panoramic pur. Dans un SUB ou FNC, on pourrait utiliser les FNC suivants comme outils pour analyser cela: - Code:
-
' retourner le nombre de paramètres dans par$ FNC NombreParametres%(par$) result val(left$(par$,iinstr(s$,",")-1)) end_fnc
' retourner la définition du paramètre no n% dans par$ fnc parametre$(par$,n%) dim_local i%, p%, q% p% = 1 i% = 0 ' chercher le début de la définition n% while i%<n% if mid$(par$,p%,1)="," then i% = i% + 1 p% = p% + 1 end_while ' ici, p% pointe sur le début du paramètre n% q% = p% while mid$(par$,q%,1)<>"," q% = q% + 1 if q%>len(par$) then exit_while end_while ' ici, q% pointe après le paramètre n% result mid$(par$,p%,q%-1) end_fnc
' comment analyser un paramètre: dim NombreDeParametres% : ' contiendra le nombre de paramètres dim Adresses%(50) : ' contiendra les adresses des paramètres définis dim Types%(50) : 'contiendra les types des paramètres définis dim Dimensions%(50) : ' contiendra les dimensions des paramètres tableau, ou zéro dim chiffres$ : chiffres$ = "0123456789"
sub Analyser(par$) dim_local i%, p$, d%, p% NombreDeParametres% = NombreParametres%(par$) for i%=1 to NombreParametres% p$ = parametre$(par$,i%) next i% Dimensions%(i%) = 0 : ' par défaut, c'est une variable simple if left$(p$,1)="A" d% = 2 while instr(chiffres$,mid$(par$,d%,1))>0 d% = d% + 1 end_while Dimensions%(i%) = val(mid$(p$,2,d%-2)) p$ = mid$(p$,d%,len(p$)) end_if if left$(p$,1)="F" then Dypes%(i%) = 1 if left$(p$,1)="I" then Dypes%(i%) = 2 if left$(p$,1)="S" then Dypes%(i%) = 3 Adresses$(i%) = val(mid$(p$,2,len(p$))) end_sub
' retourner le contenu de l'élément nelem% du tableau d'entiers décrit par le paramètre npar% fnc LireIntegerArrayElement%(npar%,nelem%) dim_local a% a% = Adresses%(npar%)+nelem%*4 result peek32(a%) end_fnc
' retourner le contenu de l'élément nelem% du tableau de flottants décrit par le paramètre npar% fnc LireFloatArrayElement(npar%,nelem%) dim_local f, a% a% = Adresses%(npar%)+nelem%*4) poke32(adr(f),peek32(a%)) poke32(adr(f)+4,peek32(a%+4)) result f end_fnc
' retourner le contenu de l'élément nelem% du tableau de texte décrit par le paramètre npar% fnc LireStringArrayElement$(npar%,nelem%) dim_local s$, a%, c$, car% a% = Adresses%(npar%)+nelem%*4) s$ = "" a% = peek32(a%) : ' parceque un élément d'un tableau string contient l'adresse du texte, pas le texte ! car% = peek(a%) : ' prendre le premier caractère while car%<>0 : ' pas encore la fin du texte ? s$ = s$ + chr$(car%) a% = a% + 1 end_while result s$ end_fnc
' écrire le contenu de l'élément nelem% du tableau d'entiers décrit par le paramètre npar% sub EcrireIntegerArrayElement%(npar%,nelem%, valeur%) dim_local a% a% = Adresses%(npar%)+nelem%*4 poke32 a%,valeur% end_sub
' écrire le contenu de l'élément nelem% du tableau de flottants décrit par le paramètre npar% sub EcrireFloatArrayElement(npar%,nelem%, valeur) dim_local f, a% a% = Adresses%(npar%)+nelem%*4) poke32(poke32(a%),adr(valeur)) poke32(poke32(a%+4),,adr(valeur)+4) end_sub
' écrire le contenu de l'élément nelem% du tableau de texte décrit par le paramètre npar% ' ATTENTION ! ' ON NE PEUT EN AUCUN CAS CHANGER LA LONGUEUR DU TEXTE EXISTANT ! ' ON PEUT SEULEMENT REMPLACER TOTZLEMENT LE TEXTE EXISTANT, EN COMPLETANT PAR DES ESPACES OU EN TRONQUANT ! sub EcrireTextArrayElement$(npar%,nelem%,valeur$) dim_local s$, a%, c$, car%, n% a% = Adresses%(npar%)+nelem%*4) s$ = "" a% = peek32(a%) : ' parceque un élément d'un tableau string contient l'adresse du texte, pas le texte ! n% = len(valeur$) if n%>0 for i%=1 to n% if peek(a%)=0 then exit_for : ' fin du string recevant les données ? alors tronquer ! poke a%,asc(mid$(valeur$,i%,1)) a% = a% + 1 next i% end_if while peek(a%)<>0 poke a%,32 : ' compléter par des espaces si nécessaire a% = a% + 1 end_while end_sub
A appeler par Analyser(Param$) | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mar 21 Nov 2023 - 15:08 | |
| Bonjour Klaus et merci. j'ai essayé de tester ton code. J'ai corrigé quelques micro-bugs dans le code Ligne 3 : le caractère i est doublé dans iinstr(... - Code:
-
result val(left$(par$,iinstr(s$,",")-1))
- Code:
-
dim prix, quantité%,libelle$,clients$(10), param$
remplacer le é de quantite% J'ai deplacé le bloc - Code:
-
' comment analyser un paramètre: dim NombreDeParametres% : ' contiendra le nombre de paramètres dim Adresses%(50) : ' contiendra les adresses des paramètres définis dim Types%(50) : 'contiendra les types des paramètres définis dim Dimensions%(50) : ' contiendra les dimensions des paramètres tableau, ou zéro dim chiffres$ : chiffres$ = "0123456789"
Mais je n'arrive toujours pas à exécuter le code. Je vois la présence de la variable s$ qui est déclarée en local dans fnc LireStringArrayElement$(npar%,nelem%)utilisée dans FNC NombreParametres%(par$)
fnc LireStringArrayElement$(npar%,nelem%) sub EcrireTextArrayElement$(npar%,nelem%,valeur$)C'est ce qui provoque l'erreur not correct ...Comme je ne suis pas au top de ma santé, je reprendai plus tard. Une fois de plus, merci Klaus et bonne continuation. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mar 21 Nov 2023 - 17:30 | |
| Oui, il y a certainement encore des oublis... j'ai codé cela rapidement. Voici ce code revu et purifié quelque peu: - Code:
-
' interface_Panoramic_accès_aux_paramètres_par_adresses.bas
' appeler Analyser de la manière suivante: ' dim param$ ' param$ = "n;par1,;...,parn ' avec parn=xa...a ' avec t=F, I, S, AFm, AIm, ASm m=nombre d'éléments dans le tableau ' a...a=str$(adr(variable))
' comment analyser un paramètre: dim NombreDeParametres% : ' contiendra le nombre de paramètres dim Adresses%(50) : ' contiendra les adresses des paramètres définis dim Types%(50) : 'contiendra les types des paramètres définis dim Dimensions%(50) : ' contiendra les dimensions des paramètres tableau, ou zéro dim chiffres$ : chiffres$ = "0123456789"
' retourner le nombre de paramètres dans par$ FNC NombreParametres%(par$) result val(left$(par$,instr(par$,",")-1)) end_fnc
' retourner la définition du paramètre no n% dans par$ fnc parametre$(par$,n%) dim_local i%, p%, q% p% = 1 i% = 0 ' chercher le début de la définition n% while i%<n% if mid$(par$,p%,1)="," then i% = i% + 1 p% = p% + 1 end_while ' ici, p% pointe sur le début du paramètre n% q% = p% while mid$(par$,q%,1)<>"," q% = q% + 1 if q%>len(par$) then exit_while end_while ' ici, q% pointe après le paramètre n% result mid$(par$,p%,q%-1) end_fnc
sub Analyser(par$) dim_local i%, p$, d%, p% NombreDeParametres% = NombreParametres%(par$) for i%=1 to NombreParametres% p$ = parametre$(par$,i%) next i% Dimensions%(i%) = 0 : ' par défaut, c'est une variable simple if left$(p$,1)="A" d% = 2 while instr(chiffres$,mid$(par$,d%,1))>0 d% = d% + 1 end_while Dimensions%(i%) = val(mid$(p$,2,d%-2)) p$ = mid$(p$,d%,len(p$)) end_if if left$(p$,1)="F" then Dypes%(i%) = 1 if left$(p$,1)="I" then Dypes%(i%) = 2 if left$(p$,1)="S" then Dypes%(i%) = 3 Adresses$(i%) = val(mid$(p$,2,len(p$))) end_sub
' retourner le contenu de l'élément nelem% du tableau d'entiers décrit par le paramètre npar% fnc LireIntegerArrayElement%(npar%,nelem%) dim_local a% a% = Adresses%(npar%)+nelem%*4 result peek32(a%) end_fnc
' retourner le contenu de l'élément nelem% du tableau de flottants décrit par le paramètre npar% fnc LireFloatArrayElement(npar%,nelem%) dim_local f, a% a% = Adresses%(npar%)+nelem%*4) poke32(adr(f),peek32(a%)) poke32(adr(f)+4,peek32(a%+4)) result f end_fnc
' retourner le contenu de l'élément nelem% du tableau de texte décrit par le paramètre npar% fnc LireStringArrayElement$(npar%,nelem%) dim_local s$, a%, c$, car% a% = Adresses%(npar%)+nelem%*4) s$ = "" a% = peek32(a%) : ' parceque un élément d'un tableau string contient l'adresse du texte, pas le texte ! car% = peek(a%) : ' prendre le premier caractère while car%<>0 : ' pas encore la fin du texte ? s$ = s$ + chr$(car%) a% = a% + 1 end_while result s$ end_fnc
' écrire le contenu de l'élément nelem% du tableau d'entiers décrit par le paramètre npar% sub EcrireIntegerArrayElement%(npar%,nelem%, valeur%) dim_local a% a% = Adresses%(npar%)+nelem%*4 poke32 a%,valeur% end_sub
' écrire le contenu de l'élément nelem% du tableau de flottants décrit par le paramètre npar% sub LireFloatArrayElement(npar%,nelem%, valeur) dim_local f, a% a% = Adresses%(npar%)+nelem%*4) poke32(poke32(a%),adr(valeur)) poke32(poke32(a%+4),,adr(valeur)+4) end_sub
' écrire le contenu de l'élément nelem% du tableau de texte décrit par le paramètre npar% ' ATTENTION ! ' ON NE PEUT EN AUCUN CAS CHANGER LA LONGUEUR DU TEXTE EXISTANT ! ' ON PEUT SEULEMENT REMPLACER TOTZLEMENT LE TEXTE EXISTANT, EN COMPLETANT PAR DES ESPACES OU EN TRONQUANT ! sub EcrireTextArrayElement$(npar%,nelem%,valeur$) dim_local s$, a%, c$, car%, n% a% = Adresses%(npar%)+nelem%*4) a% = peek32(a%) : ' parceque un élément d'un tableau string contient l'adresse du texte, pas le texte ! n% = len(valeur$) if n%>0 for i%=1 to n% if peek(a%)=0 then exit_for : ' fin du string recevant les données ? alors tronquer ! poke a%,asc(mid$(valeur$,i%,1)) a% = a% + 1 next i% end_if while peek(a%)<>0 poke a%,32 : ' compléter par des espaces si nécessaire a% = a% + 1 end_while end_sub
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mer 22 Nov 2023 - 21:37 | |
| Avec mes problèmes de santé, je ne sais quoi fer, je m'acier ou je métal En attendant, j'ai besoin de me soigner. Bon, à l'un de ces jours. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mer 22 Nov 2023 - 23:16 | |
| Je compatis, Papydall,et je te souhaite de trouver le plus rapidement possible le chemin vers une amélioration de ta santé. Je sais, il y a des moments où l'on voudrait revenir 10 ans an arrière, ou alors enjamber les mois ou les annés à venir, mais la vérité vraie, c'est que chaque moment, même les plus durs, méritent d'être vécus et controibuent à nous construire et à nous grandir. Alors, soigne-toi et ne fais attention à rien d'autre. Je suis passé par là il n'y a pas si longtemps, et je sais de quoi je parle. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 23 Nov 2023 - 18:19 | |
| Je ne te dirai pas mieux que Klaus. Soignes toi et reviens nous en forme. A bientôt Papydall. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Simulation de passage de tableau à un sous-programme Jeu 23 Nov 2023 - 21:37 | |
| Soigne toi, Papydall, c'est ça le plus important. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Simulation de passage de tableau à un sous-programme Ven 24 Nov 2023 - 16:22 | |
| Prend bien soin de ta santé. A très bientôt, Papydall ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Simulation de passage de tableau à un sous-programme Mer 6 Déc 2023 - 23:59 | |
| Merci les amis. Je vais un petit peu mieux. Je vais jetter un oeil sur ce que vous avez partagé. | |
| | | Contenu sponsorisé
| Sujet: Re: Simulation de passage de tableau à un sous-programme | |
| |
| | | | Simulation de passage de tableau à un sous-programme | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |