3

C ++での私のコードは

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

そして私の機能は

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

CFFIは初めてです。だから私の質問は

  1. CFFIで同じことを達成するにはどうすればよいですか?

  2. CFFIの構造体へのポインタ、ポインタのアドレスを見つける方法は?

void**へのキャストは次の方法で実行できることを知っています

ffi.cast("void*",address)

しかし、どうすればそのアドレスを取得して関数に渡すことができますか?

4

1 に答える 1

3

使用可能であると宣言arg = ffi.new("void **")することができます。

次のコードが出力されます

<cdata 'void *' NULL>

<cdata 'void *' 0xc173c0>

7

つまり、最初はポインタの値が 0 であり、呼び出し後の値は で設定された値に対応します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;
}
于 2016-07-22T19:16:38.827 に答える