Donc pourquoi est-ce que dans la fonction
pot(k,v,d) j'utilise des fonctions dédiées
setll(ll) / setls(ls) / setst(st) / setcode(v) pour modifier les variables globales
ll / ls / st / code ?
- Code: Tout sélectionner
def setst(k,v):
global st
st[k]=v
def setll(k,v):
global ll
ll[k]=v
def setls(k,v):
global ls
ls[k]=v
def setcode(v):
global code
code=v
- Code: Tout sélectionner
def pot(k,v=1,d=True):
if k>=0 and k<st[1]:
v=f2mf(max(min(v,1),0))
setst(2,st[2]+v-ls[k])
for l in range(st[0]):
if bitand(sla[l],2**k):
ol=ll[l]
setll(l,ll[l]+v-ls[k])
setst(3,st[3]+((f2mf(1)<=ll[l]<=f2mf(2)) and ((ol<f2mf(1)) or (ol>f2mf(2))))-(((ll[l]<f2mf(1)) or (ll[l]>f2mf(2))) and (f2mf(1)<=ol<=f2mf(2))))
setst(4,st[4]+max(ll[l]-f2mf(1),0)-max(ol-f2mf(1),0))
setst(5,st[5]+ll[l]*(ll[l]<f2mf(1))-ol*(ol<f2mf(1)))
setst(6,st[6]+((f2mf(2)<ll[l]) and (ol<=f2mf(2)))-((ll[l]<=f2mf(2)) and (ol>f2mf(2))))
setls(k,v)
s=float(st[3]-mf2f(st[2]+st[6]/2+st[4]/5+st[5]/10))
c=smf(ls)
setcode(c)
ss=pst(s,d)
if d:
print("Code info@tiplanet.org (var CAS 'code') :")
print(c+" ")
return {c,s}
Ai-je perdu la raison ? Est-ce que je n'ai rien compris à l'instruction
global et par extension au Python ? Est-ce que je cherche à vous embrouiller ? Ni l'un ni l'autre.
Une fois de plus, ce code commun à toutes les déclinaisons du script est là pour contourner une anomalie, ici sur HP Prime et peut-être Khicas au code voisin.
Modifions la fonction
pot(k,v,d) pour ne plus utiliser ces fonctions d'affectations globales externes :
- Code: Tout sélectionner
def pot(k,v=1,d=True):
global ll,ls,st,code
if k>=0 and k<st[1]:
v=f2mf(max(min(v,1),0))
st[2]=st[2]+v-ls[k]
for l in range(st[0]):
if bitand(sla[l],2**k):
ol=ll[l]
ll[l]=ll[l]+v-ls[k]
st[3]=st[3]+((f2mf(1)<=ll[l]<=f2mf(2)) and ((ol<f2mf(1)) or (ol>f2mf(2))))-(((ll[l]<f2mf(1)) or (ll[l]>f2mf(2))) and (f2mf(1)<=ol<=f2mf(2)))
st[4]=st[4]+max(ll[l]-f2mf(1),0)-max(ol-f2mf(1),0)
st[5]=st[5]+ll[l]*(ll[l]<f2mf(1))-ol*(ol<f2mf(1))
st[6]=st[6]+((f2mf(2)<ll[l]) and (ol<=f2mf(2)))-((ll[l]<=f2mf(2)) and (ol>f2mf(2))))
ls[k]=v
s=float(st[3]-mf2f(st[2]+st[6]/2+st[4]/5+st[5]/10))
c=smf(ls)
code=c
ss=pst(s,d)
if d:
print("Code info@tiplanet.org (var CAS 'code') :")
print(c+" ")
return {c,s}
Et bien voilà, bien joué, maintenant ça ne fonctionne plus du tout sur HP Pime, tout appel à
pot() renvoyant une erreur.
Utilisons le débogueur pas à pas pour comprendre ce qui se passe dans cette fonction, via un appel
pot(3,1,True).
Nous arrivons donc à l'exécution la nouvelle ligne
global avec cet environnement :
Existent donc les variables locales définies par les paramètres d'appel :
k=3
v=1
d=TruePassons à la ligne suivante en exécutant la ligne
global, grâce au bouton tactile
Palier :
Et bien voilà, gros problème, les variables locales passées en paramètres
k / v / d n'existent plus. Leurs valeurs ont été perdues.
Toute référence à ces noms de variables dans la suite du script sera évaluée avec la valeur de la variable globale de même nom si existante. A défaut, l'évaluation de
k par exemple retournera l'expression
'k'.
Bref, l'exécution du reste du script va ou faire n'importe quoi, ou retourner une erreur
C'est toutefois un bug bien sournois, puisque bizarrement il ne se produit pas avec les fonctions plus simples
setll(ll) / setls(ls) / setst(st) / setcode(c), qui de même commencent par une instruction
global dans le contexte de variables locales passées en paramètre.