Page 6 sur 11

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 22 Sep 2018, 11:15
de critor
Le participant n°9 continue à creuser l'écart, avec maintenant 227 points et quelques ! :bj:
https://tiplanet.org/triconcours.php

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 22 Sep 2018, 11:45
de critor
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 :
Image
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 :
Image
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.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 22 Sep 2018, 13:17
de parisse
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.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 22 Sep 2018, 15:21
de critor
Le participant n°9 en 1ère place continue à progresser, avec maintenant 227,6 points et quelques ! :bj:
https://tiplanet.org/triconcours.php

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 23 Sep 2018, 09:04
de critor
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 ! :bj:
https://tiplanet.org/triconcours.php

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 24 Sep 2018, 08:55
de ggauny@live.fr
Bonjour,
@M Critor, cet écran est-il normal ??? Que viennent faire ces fonctions
Force_PB.png
Force_PB.png (21.26 Kio) Vu 3895 fois
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.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 24 Sep 2018, 11:04
de critor
ggauny@live.fr a écrit:@M Critor, cet écran est-il normal ??? Que viennent faire ces fonctionsImage 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.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 24 Sep 2018, 11:58
de ggauny@live.fr
Merci pour votre réponse.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 25 Sep 2018, 12:28
de ggauny@live.fr
TiP.png
TiP.png (17.07 Kio) Vu 3799 fois
Bonjour,

ma participation au concours.

Re: Triconcours de rentrée 2018 - défi de Force

Message non luPosté: 25 Sep 2018, 16:57
de critor
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 ! :bj:

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.