Я пытаюсь использовать указатель внутри класса cython.Cython, используя указатель функции внутри класса
outside_class
ctypedef
работает как шарм, но я не могу получить inside_class
для работы. здесь вызывается ошибка ctypedef, которая не разрешена здесь, и я не понимаю, что не так.
Почему эта работа
outside_class
typdef работает, поэтому я предположил, что это должно работать внутри. Мне не удалось заставить его работать, поэтому я попытался найти дополнительную информацию об этом, к сожалению, вся информация о примере outside_class
, поэтому я не знаю, разрешено или возможно другое. мне кажется, что единственная разница - это аргумент self
.
Почему я хочу, чтобы это работало
Этот класс будет содержать 35+ функции с теми же аргументами, когда используется только часть этих функций вызывается в определенном порядке. При инициализации я хочу создать массив со всеми функциями в правильном порядке. Конечно, другой способ сделать это также приветствуется.
обновленный код образца 14-02
тест А Б & работа, но С & D нет, сообщение об ошибке приведен ниже.
Мой код:
ctypedef int (*outside_class)()
ctypedef int (*inside_class)(Preprocess)
cdef int outside_foo():
return 12
cdef int outside_bar(Preprocess self):
return 20
cdef class Preprocess:
cdef int inside_foo(self):
return 18
cdef int inside_bar(self):
return 14
cdef int inside_sek(self):
return 16
def __init__(self):
cdef outside_class test_A
test_A = &outside_foo
print(test_A())
cdef inside_class test_B
test_B = &outside_bar
print(test_B(self))
cdef inside_class test_C
test_C = &self.inside_foo
#print(test_C(self))
print("no error, yet..")
cdef inside_class test_D
test_D = &self.inside_foo
print(test_D(self))
ошибка
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c: In function ‘__pyx_pf_7aa_13preprocessing_13preprocessing_10Preprocess___init__’:
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:938:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
__pyx_v_test_C = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
^
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:955:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
__pyx_v_test_D = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
^
12
20
no error, yet..
Segmentation fault (core dumped)
Вам нужно объяснить, почему вы думаете, что это должно сработать и/или почему вам это нужно. Возможно, нет смысла определять/указывать тип C на уровне класса.На одной обучающей странице есть этот комментарий перед 'ctypedef':' # определить глобальное имя для любого типа char, который используется в модуле'. Это и все другие примеры указывают на то, что это удобство именования уровня модуля. – hpaulj