2016-04-26 19 views
1

現在、次のライブラリ(http://sol.gfxile.net/escapi/)とctypesを使用してインターフェイスを構築しようとしていますが、何か間違っているかライブラリが期待通りに動作しないctypesの返り値の空値int配列へのポインタ

from ctypes import cdll, Structure, c_int, POINTER, cast, c_long, pointer 

class SimpleCapParams(Structure): 
    _fields_ = [ 
     ("mTargetBuf", POINTER(c_int)), 
     ("mWidth", c_int), 
     ("mHeight", c_int) 
    ] 

width, height = 512, 512 
array = (width * height * c_int)() 
options = SimpleCapParams() 
options.mWidth = width 
options.height = height 
options.mTargetBuf = array 

lib = cdll.LoadLibrary('escapi.dll') 
lib.initCOM() 
lib.initCapture(0, options) 
lib.doCapture(0) 
while lib.isCaptureDone(0) == 0: 
    pass 

print options.mTargetBuf 

lib.deinitCapture(0) 
:あなたはこれが私の現在のコードでこの

struct SimpleCapParams 
{ 
    /* Target buffer. 
    * Must be at least mWidth * mHeight * sizeof(int) of size! 
    */ 
    int * mTargetBuf; 
    /* Buffer width */ 
    int mWidth; 
    /* Buffer height */ 
    int mHeight; 
}; 

のように見えますinitCaptureに渡すことを意味している構造体があり

(サンプルCアプリケーションが動作するように見えます) 0

しかし、mTargetBufのすべての値は0です。私はこれを間違って呼び出しているのでしょうか、何か他のことが起こっていますか?

これは私が(ASCIIなし)何をする必要があるかのC++の例である:https://github.com/jarikomppa/escapi/blob/master/simplest/main.cpp

+1

例は '&capture'を通過します。だから、 'options'は値渡しではなく参照渡しが必要です。 'lib.initCapture(0、ctypes.byref(options))'です。 – eryksun

+0

ありがとうございますが、依然として0を返すようです。options.mTargetBuf.contentsを実行すると 'c_long(0)'が返されます –

+0

'initCapture'が失敗したかどうか、つまり0を返すかどうかを確認する必要があります。 'options.mTargetBuf'ではなく、配列がサイズ変更されているので安全です。 'options.mTargetBuf [i]'を使うと、配列を越えて読み込み、segfaultを起こすことができます。 – eryksun

答えて

2

だから私は私のコードをチェックする必要がありそうです:)

options.height = height私の構造につきとしてoptions.mHeight = heightする必要があります。

byrefもお手伝いしました。コード作業

:プロトタイプは `` initCapture(unsigned int型deviceno、構造体SimpleCapParams * aParams)をint型であるため

from ctypes import * 

width, height = 512, 512 

class SimpleCapParms(Structure): 
    _fields_ = [ 
     ("mTargetBuf", POINTER(c_int)), 
     ("mWidth", c_int), 
     ("mHeight", c_int), 
    ] 

array_type = (width * height * c_int) 
array = array_type() 
options = SimpleCapParms() 
options.mWidth = width 
options.mHeight = height 
options.mTargetBuf = array 

lib = cdll.LoadLibrary('escapi.dll') 
lib.initCapture.argtypes = [c_int, POINTER(SimpleCapParms)] 
lib.initCapture.restype = c_int 
lib.initCOM() 

lib.initCapture(0, byref(options)) 
lib.doCapture(0) 

while lib.isCaptureDone(0) == 0: 
    pass 

print(array[100]) 

lib.deinitCapture(0) 
関連する問題