La création de C structs dans Cython
J'aimerais créer ma propre liste de conteneur à l'aide de Cython. Je suis un tout nouveau débutant, et, d'après la documentation que j'ai pu obtenir pour la création d'une telle structure :
cdef struct s_intList:
int value
void* next
ctypedef s_intList intList
mais quand vient le temps de l'acces a la les membres de la structure, je ne trouve pas la bonne syntaxe:
cpdef void foo():
cdef intList* li
# li.value OR li->value
lance : "avertissement: intlists.custode:8:12: la variable locale 'li' référencé avant affectation"
ce qui laissait à penser que mon cython les structures d'utilisation est incorrecte...
Aucune idée de ce que je fais mal ici, s'il vous plaît? 🙂
Merci pour vous aider à
- Je reçois
Cannot convert 'void' to Python object
, mais si je régler ce problème il n'y a pas d'erreur. Soit vous avez un vieux Cython version, ou vous n'êtes pas en montrant la partie pertinente de votre code.
Vous devez vous connecter pour publier un commentaire.
Vous devez allouer de la mémoire pour le intList. Soit avec une variable locale ou
à l'aide de malloc.
None
.Dans votre code,
li
est un pointeur à unintList
. Ce pointeur n'est pas initialisé à point à quoi que ce soit, l'accès àli.value
est dénuée de sens (et erronée).Dans fabrizioM réponse, un
intList
est créé (pas un pointeur vers un) sur la pile, donc il y a un emplacement dans la mémoire réservée pourli.value
.Si vous souhaitez créer un
intList
avec des données réelles (que je suppose que vous l'intention d'être comme une liste chaînée structure de données), et si vous voulez être en mesure de revenir queintList
à partir de fonctions, etc. vous devez répartir votreintList
les structures sur le tas et de construire jusqu'à la pleine liste liée à partir de là. Cython vous permet d'appelermalloc
(etfree
) facilement pour ce faire.