Triconcours de rentrée 2018 - défi de Force
Re: Triconcours de rentrée 2018 - défi de Force
Le participant n°9 continue à creuser l'écart, avec maintenant 227 points et quelques !
https://tiplanet.org/triconcours.php
https://tiplanet.org/triconcours.php
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Re: Triconcours de rentrée 2018 - défi de Force
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 ?
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 :
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=True
Passons à 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.
- Code: Select all
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: Select all
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: Select all
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=True
Passons à 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.
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Re: Triconcours de rentrée 2018 - défi de Force
La difference etant qu'il n'y a pas de variables locales a setst (en-dehors des arguments). Ceci devrait etre corrige dans Khicas (sur la HP il faudra attendre le prochain firmware...).
Explication: Python declare implicitement les variables d'une fonction comme locales, contrairement a Xcas (Xcas considere toute variable non declaree comme globale et affiche un warning). J'ai donc du ajouter du code pour auto-declarer comme locales les variables non declarees dans une fonction. Mais je n'avais pas teste dans un contexte mixte avec des variables globales declarees explicitement. Or cela provoquait la creation de 2 environnements d'evaluation au lieu d'un, le 2eme masquant le premier, c'est ce bug qui a ete corrige.
Explication: Python declare implicitement les variables d'une fonction comme locales, contrairement a Xcas (Xcas considere toute variable non declaree comme globale et affiche un warning). J'ai donc du ajouter du code pour auto-declarer comme locales les variables non declarees dans une fonction. Mais je n'avais pas teste dans un contexte mixte avec des variables globales declarees explicitement. Or cela provoquait la creation de 2 environnements d'evaluation au lieu d'un, le 2eme masquant le premier, c'est ce bug qui a ete corrige.
-
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)- Posts: 3699
- Joined: 13 Dec 2013, 16:35
- Gender:
- Calculator(s):→ MyCalcs profile
Re: Triconcours de rentrée 2018 - défi de Force
Le participant n°9 en 1ère place continue à progresser, avec maintenant 227,6 points et quelques !
https://tiplanet.org/triconcours.php
https://tiplanet.org/triconcours.php
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Re: Triconcours de rentrée 2018 - défi de Force
Avec pas moins de 6 participations pendant la nuit, le participant n°8 atteint 225,8 points et quelques, passant ainsi de la 3ème à la 2nde place !
https://tiplanet.org/triconcours.php
https://tiplanet.org/triconcours.php
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Re: Triconcours de rentrée 2018 - défi de Force
Bonjour,
@M Critor, cet écran est-il normal ??? Que viennent faire ces fonctions dans votre application ?
Je me demande si je n'ai pas un problème avec ma Prime(virtuelle).
Merci et bonne journée.
G Gauny.
@M Critor, cet écran est-il normal ??? Que viennent faire ces fonctions dans votre application ?
Je me demande si je n'ai pas un problème avec ma Prime(virtuelle).
Merci et bonne journée.
G Gauny.
You do not have the required permissions to view the files attached to this post.
-
ggauny@live.frPremium
Niveau 9: IC (Compteur Infatigable)- Posts: 293
- Joined: 11 Mar 2015, 20:43
- Gender:
- Calculator(s):→ MyCalcs profile
Re: Triconcours de rentrée 2018 - défi de Force
ggauny@live.fr wrote:@M Critor, cet écran est-il normal ??? Que viennent faire ces fonctions dans votre application ?
Bonjour.
J'ai pareil et je ne sais pas, rien codé en ce sens.
Je suis reparti de l'application que nous avions codée pour le concours de rentrée 2017.
Et à l'époque, c'était notre toute première fois, il est possible que j'ai démarré en clonant une application existante au lieu de partir d'une nouvelle application vide.
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Re: Triconcours de rentrée 2018 - défi de Force
Merci pour votre réponse.
-
ggauny@live.frPremium
Niveau 9: IC (Compteur Infatigable)- Posts: 293
- Joined: 11 Mar 2015, 20:43
- Gender:
- Calculator(s):→ MyCalcs profile
Re: Triconcours de rentrée 2018 - défi de Force
ma participation au concours.
You do not have the required permissions to view the files attached to this post.
-
ggauny@live.frPremium
Niveau 9: IC (Compteur Infatigable)- Posts: 293
- Joined: 11 Mar 2015, 20:43
- Gender:
- Calculator(s):→ MyCalcs profile
Re: Triconcours de rentrée 2018 - défi de Force
Vu que c'est public et que n'importe qui pourrait donc la reprendre à son compte, je l'ai prise en compte :
https://tiplanet.org/triconcours.php
Félicitations, pour le moment elle fait partie des 10 meilleures et décrocherait donc un lot !
Par contre pour la prochaine fois, merci de transmettre comme les autres la participation par courriel à info@tiplanet.org, avec l'ensemble des informations nécessaires.
https://tiplanet.org/triconcours.php
Félicitations, pour le moment elle fait partie des 10 meilleures et décrocherait donc un lot !
Par contre pour la prochaine fois, merci de transmettre comme les autres la participation par courriel à info@tiplanet.org, avec l'ensemble des informations nécessaires.
-
critorAdmin
Niveau 19: CU (Créateur Universel)- Posts: 42133
- Images: 16453
- Joined: 25 Oct 2008, 00:00
- Location: Montpellier
- Gender:
- Calculator(s):→ MyCalcs profile
- YouTube: critor3000
- Twitter: critor2000
- GitHub: critor
Who is online
Users browsing this forum: ClaudeBot [spider] and 7 guests