Ho una funzione che ha il prototipo, come di seguitoRuggine FFI. Casting di annullare puntatore
//opaque struct
struct mosquitto;
struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *obj);
Nel mio codice C, sto chiamando come qui sotto.
struct mosquitto *m = mosquitto_new(buf, true, NULL);
Ora voglio chiamare l'API di cui sopra nel mio codice ruggine. ruggine bindgen generato il seguente attacchi
pub enum Struct_mosquitto { }
pub fn mosquitto_new(id: *const ::libc::c_char, clean_session: u8, obj: *mut ::libc::c_void) -> *mut Struct_mosquitto;
Quando sto cercando di chiamare l'API di cui sopra, sto diventando una mancata corrispondenza al terzo argomento.
let s = CString::new("ravi").unwrap();
let mqtt = mosquitto::mosquitto_new(s.as_ptr(), 1, ptr::null());
Come passare NULL a * mut c_void?
DOMANDA BONUS: Come passare una struttura di ruggine a * mut c_void?
Grazie. Ha funzionato. C'è un modo per stampare la struct indicata da 'mqtt'? Mi viene il panico quando provo questo -> println! ("Mqtt = {:?}", * Mqtt); – tez
forse la tua funzione 'mosquitto_new' restituisce un valore NULL, o perché stai usando un enum vuoto come rappresentazione. Un enum vuoto non può essere costruito, quindi Rust inserisce 'unreachable!()' Chiama prima di qualsiasi codice che interagisce con enumerazioni vuote. Ecco un esempio minimo: http://is.gd/BOEDgb –