我試圖在實現一種特殊的文件結構的用Cython使用C庫使用文件指針的結構:如何在用Cython
struct XDRFILE
{
FILE * fp; //< pointer to standard C library file handle
void * xdr; //< pointer to corresponding XDR handle
char mode; //< r=read, w=write, a=append
int * buf1; //< Buffer for internal use
int buf1size; //< Current allocated length of buf1
int * buf2; //< Buffer for internal use
int buf2size; //< Current allocated length of buf2
};
與方法來打開和關閉這樣的對象在一起:
XDRFILE* xdrfile_open(const char* path, const char* mode)
int xdrfile_close(XDRFILE* xfp)
現在我想能夠訪問文件指針在這個結構並把它傳遞給FSEEK和FTELL操縱文件指針的位置。
什麼我迄今所做的是
from cython.view cimport array as cvarray
import numpy as np
cimport numpy as np
from libc.stdio cimport FILE, fseek
cdef extern from "xdrfile.h":
ctypedef struct XDRFILE:
FILE* fp #< pointer to standard C library file handle
void* xdr #< pointer to corresponding XDR handle
char mode #< r=read, w=write, a=append
int* buf1 #< Buffer for internal use
int buf1size #< Current allocated length of buf1
int* buf2 #< Buffer for internal use
int buf2size #< Current allocated length of buf2
XDRFILE* xdrfile_open(const char* path, const char* mode)
int xdrfile_close(XDRFILE* xfp)
int xdrfile_read_int(int* ptr, int ndata, XDRFILE* xfp)
def Read(filepath):
cdef XDRFILE* FH = xdrfile_open(filepath, "r")
cdef np.ndarray[np.int32_t, ndim=1] Header = np.zeros(23, dtype=np.int32)
xdrfile_read_int(<int*> Header.data, 23, FH)
print Header ## up to here everything works just fine
#now here starts the problem:
fseek(FH[0].fp, 159240, 0)
fseek(FH.fp , 159240, 0)
# does not work: "dereferencing pointer of incomplete type"
## even more brutal things do not work:
FH.fp[0] += 159240
一個用Cython文件缺少什麼我在這裏?是在開始時的聲明是否爲false或者是我傳遞指針的方式?
好了,感謝您的建議我心中已經累到HANDELS如何用Cython的typedef閱讀起來,在Cython documentation發現 一對夫婦fomulars它應該如何工作。但是我仍然無法得到它的權利:
我沒想到它會更早重要,但這個是確切的結構: 有
xdrlib.c:
struct XDRFILE
{
FILE * fp; //< pointer to standard C library file handle
void * xdr; //< pointer to corresponding XDR handle
char mode; //< r=read, w=write, a=append
int * buf1; //< Buffer for internal use
int buf1size; //< Current allocated length of buf1
int * buf2; //< Buffer for internal use
int buf2size; //< Current allocated length of buf2
};
xdrlib。 H:
typedef struct XDRFILE XDRFILE;
XDRFILE* xdrfile_open(const char* path, const char* mode)
int xdrfile_close(XDRFILE* xfp)
,現在我想翹曲與用Cython,這樣我可以這樣做:
cdef XDRFILE* FH = xdrfile_open(filepath, "r")
fseek(FH.fp, 1000, 0)
在我看來,這將是在我之前發佈的鏈接所描述的最後一種情況,所以結構和類型定義具有相同的名稱。這表明沒有ctypedef insetad「正常」,「CDEF結構」:對此解釋:
「如果頭使用相同的名稱,標籤和類型定義,你會不會 能夠包括ctypedef爲它 - 但是,它沒有必要「
然而,這會給我:」未定義類型»結構XDRFILE«錯誤使用「 和額外的:‘一個指向不完全類型’