2016-04-26 3 views
9

Je voudrais passer comme argument d'une fonction dans mon module C un tableau de uint8_t.Comment faire face à uint8_t sur une extension Python?

Je n'ai pas trouvé de méthode pour analyser directement ce tableau, donc je l'analyse en PyObject_t, puis en l'itérant en tant qu'objet PyTuple_t. De cette façon, j'ai besoin de lancer chaque élément PyObject_t de ce tuple à uint8_t. Comment puis-je faire cela, une fois qu'il n'y a pas de fonction PyInt_FromUINT8_t ou quelque chose comme ça?

Répondre

5

Vous pouvez généralement vous en sortir avec B en utilisant unsigned char. Selon Parsing Arguments vous devriez juste être en mesure de le faire.

uint8_t b; 
if (!PyArg_ParseTuple("b", &b)) { 
    return NULL; 
} 

Si pas directement en utilisant des arguments (par exemple, vous faites affaire avec un PyObject, il suffit d'utiliser l'un des PyInt_*, PyLong_* ou PyNumber_* fonctions (https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t)

Conversion d'un uin8_t à un PyObject est simple aussi bien, vous pouvez utiliser PyInt_FromLong ou PyLong_FromLong

+0

Je travaille avec des tableaux. Dans ce cas, itérer sur un PyTuple ou PyList en utilisant Pyin t_FromLong ne provoquera pas un accès mémoire invalide? Cette fonction essaie de lire 4 ou 8 octets mais chaque élément de la liste n'a qu'un octet alloué. –

+0

Aucune des fonctions 'PyXXX' n'utilise de pointeurs sur les entiers, mais les renvoie simplement par valeur; donc 'PyInt_FromLong' par exemple accepterait un' int' comme argument, et il serait sujet aux conversions de type normal et aux coercions entières. Pouvez-vous expliquer un peu plus ce que vous essayez de faire? –

+0

J'ai mis à jour la question. Vérifiez si c'est clairement maintenant. –