Как использовать memcpy в Cython

with open(fname, 'rb') as fp:
    line = fp.readline().strip()
    content = fp.read()
cdef int nb = len(content)
#print("Hello ", nb)
cdef char* c_string = <char *> malloc((nb + 1) * sizeof(char))
cdef char* tmp_str = <char *> malloc(4)
memcpy(tmp_str, c_string + 8, 4)
print(atof(tmp_str))    # this line is ok
for i in range(nb):
    memcpy(tmp_str, c_string + i, 4)  # error occur
    # print(atof(tmp_str))

Ошибка:

    for i in range(nb):
    memcpy(tmp_str, c_string + i, 4)`
                            ^       `
decodex.pyx:23:33: Cannot convert Python object to 'const void *'`

Я искал, но не нашел примера использования «memcpy» с необработанным указателем.


person qinshuo    schedule 17.01.2020    source источник
comment
Вы импортировали memcpy? Если вы это сделали, добавьте это в свой пример, иначе cimport memcpy.   -  person ead    schedule 17.01.2020


Ответы (1)


Проблема в том, что вы добавляете c_string и i. Тип iobject. Добавьте cdef int i прямо перед циклом for, чтобы тип i был int.

Это компилируется и работает для меня:

In [1]: !echo "some text\nfor the file" > foo.txt                                                                                                                                              

In [2]: %load_ext cython                                                                                                                                                                       

In [3]: %%cython 
...: from libc.stdlib cimport malloc 
...: from libc.string cimport memcpy 
...: from libc.stdlib cimport atof 
...:  
...: with open('foo.txt', 'rb') as fp: 
...:     line = fp.readline().strip() 
...:     content = fp.read() 
...: cdef int nb = len(content) 
...: #print("Hello ", nb) 
...: cdef char* c_string = <char *> malloc((nb + 1) * sizeof(char)) 
...: cdef char* tmp_str = <char *> malloc(4) 
...: memcpy(tmp_str, c_string + 8, 4) 
...: print(atof(tmp_str))    # this line is ok 
...: cdef int i 
...: for i in range(nb): 
...:     memcpy(tmp_str, c_string + i, 4) 
person Stephen    schedule 18.01.2020