3 votes

Python - Comment cela peut-il retourner -1 ?

Cette méthode devrait-elle pouvoir renvoyer -1 ?

def tree_value(self, team, x, y):
    if team == NO_TEAM or self.team_sees_tree[team, x, y]:
        return int(self.tree[x, y])
    else:
        return TREE_NONE

Mise en place :

import numpypy as np

TREE_NONE = 255
NO_TEAM = -1

self.tree= np.empty((dim, dim), np.uint8)
    for i in xrange(dim):
        for j in xrange(dim):
            self.tree[i, j] = TREE_NONE
    self.team_sees_tree = np.zeros((16, dim, dim), np.bool_)

En fonctionnement normal, les valeurs des arbres sont fixées à 0-15 (numéro d'équipe) ou TREE_NONE (255). Même si elles étaient accidentellement réglées sur -1 (NO_TEAM), cela devrait correspondre à 255 en uint8.

Appel à tree_value() qui obtient le -1 :

data = [(self.Tiles.tree_value(COLOR_NONE, x, y),
    self.Tiles.mountain_value(x, y)) for (x, y) in coords]
str = ""
try:
    for (t, m) in data:
        str += chr(t) + chr(m)
except ValueError as e:
    print data
        # [(255, 0), (255, 0), (255, 0), (255, 0), (255, 0), (-1, 0), (255, 0)]
    print e
        # ValueError: character code not in range(256)

Je ne peux pas reproduire ce problème avec précision, mais mon serveur le rencontre environ deux fois par heure. J'utilise PyPy en version récente (pypy-c-jit-64927-e0ba4acfd3c2-linux.tar.bz2) sur Ubuntu 12.04 32bit.

4voto

Armin Rigo Points 4754

Corrigé dans PyPy ; il s'agissait en fait d'un bogue (voir https://bugs.pypy.org/issue1578 ). Le code d'un chemin rarement exécuté oubliait les entiers non signés et lisait donc toujours l'octet comme une valeur signée. Plus précisément, ce code se trouvait dans le traceur JIT. C'est pourquoi il ne donnait qu'une seule fois un résultat erroné, alors que tous les résultats précédents étaient corrects (calculés par l'interpréteur) et que tous les résultats suivants étaient également corrects (calculés par l'assembleur que nous venons de générer).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X