2016-07-22 12 views
0

in C++ istWie Adresse eines Zeigers zu finden, sie zu strukturieren und werfen Mein Code ungültig zu erklären ** in CFFI

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

und meine Funktion ist

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

Ich bin neu in CFFI. Also meine Frage ist

  1. Wie kann ich das gleiche in CFFI erreichen?

  2. Wie finde ich die Adresse eines Zeigers, Zeiger auf Struktur in CFFI?

Ich weiß Gießen void** kann durch

ffi.cast("void*",address) 

getan werden, aber wie kann ich diese Adresse bekommen und an die Funktion übergeben?

Antwort

1

Es ist möglich, arg = ffi.new("void **") zu deklarieren, die möglicherweise verwendbar sind.

Der folgende Code druckt

< cdata 'void *' NULL >

< cdata 'void *' 0xc173c0 >

dh zuerst der Wert von Zeiger ist Null, und nach dem Aufruf entspricht der Wert dem Wert e gesetzt in 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

Danke Hakala für eine solche klare Erklärung. Können Sie mir bitte erklären, ob der Fall unter 1 arbeitet angegeben) I Erinnerung an eine Struktur für eine Variable struct_object zugeteilt es zeigt mir 2) erstellt eine Lücke ** variable void_object = cfg_cffi.ffi.new ("void **") 3) Weisen Sie den Speicher der Strukturvariable void zu ** void_object [0] = struct_object 4) Jetzt void_object [0] für die Funktion übergeben in der Frage angegeben Das Programm funktioniert ohne Fehler, aber gibt -1 zurück, die bestimmte Fehlerbedingung gemäß der Implementierung ist Entbindung. – Ash

+0

Haben Sie versucht, 'void_object' anstelle von' void_object [0] 'zu übergeben? –

+0

@Hakala ... Es funktioniert. Danke vielmals... – Ash