2013-11-22 65 views
2

我試圖在實現一種特殊的文件結構的用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«錯誤使用「 和額外的:‘一個指向不完全類型’

回答

1

的解除引用最後一行將無法工作。您不能間接輸入FILE*,更不用說爲其添加long

下一個錯誤是在頭文件。它聲明struct XDRFILE但不typedef,爲XDRFILE,然後使用XDRFILE不會在功能原型struct。當這個問題得到解決後,Cython 0.19.2將會毫無問題地編譯出來。