2016-07-22 11 views
0
に** voidにそれをキャストするポインタのアドレスを見つけるために、どのように

C++での私のコードは構造とCFFI

StructureEx* obj; // structure 
functionEx((void**)&obj); 

で、私の機能は、私がCFFIに新しいです

int functionEx(void** obj); //calling function 

です。だから私の質問は

  1. どのように私はCFFIで同じことを達成できますか?

  2. CFFIの構造体へのポインタのアドレスの検索方法は?

私はvoid**にキャストすることを知っているが

ffi.cast("void*",address) 

によって行うことができる。しかし、どのように私は、そのアドレスを取得し、関数に渡すことができますか?

答えて

1

arg = ffi.new("void **")を使用すると宣言できます。

次のコード印刷

< CDATA 'ボイド*' NULLの>

< CDATA 'ボイド*' 0xc173c0 >

すなわち最初の値ポインタがゼロであり、コールの後に値が値に対応するeはfunctionExに設定されます。

from cffi import FFI 

ffi = FFI() 
ffi.cdef("""int functionEx(void** obj);""") 

C = ffi.dlopen("./foo.so") 
print(C) 
arg = ffi.new("void **") 
print(arg[0]) 
C.functionEx(arg) 
print(arg[0]) 
ints = ffi.cast("int *", arg[0]) 
print(ints[7]) 
#include <stdio.h> 
#include <stdlib.h> 

int functionEx(void ** obj) 
{ 
    int * arr; 
    int i; 

    *obj = malloc(sizeof(int) * 8); 

    arr = *obj; 
    for (i=0; i<8; i++) { 
     arr[i] = i; 
    } 

    return 0; 
} 
+0

、このような明確な説明のためにあなたにHakalaをありがとうございます。 あなたは、私はそれが 私を示し変数 struct_object ための構造のメモリを割り当てた)下記の特定のケースが 1を動作するかどうか私に説明していただけます 2)は、ボイドを作成しました**変数 void_object = cfg_cffi.ffi.new( "void **") 3)struct変数のメモリをvoid ** に割り当てます。void_object [0] = struct_object 4)関数のためにvoid_object [0]を渡します プログラムはエラーなく動作しますが、implemに応じて特に失敗した-1を返します。 – Ash

+0

'void_object [0]'の代わりに 'void_object'を渡してみましたか? –

+0

@ハカラ...それは動作します。どうもありがとう... – Ash