mexPrintf
, podobnie jak printf
, akceptuje listę argumentów varargs. Nie wiem, jaki jest najlepszy sposób na owinięcie tego w Rust. Jest RFC for variadic generics, ale co możemy zrobić dzisiaj?Jak zawinąć wywołanie do funkcji FFI, która używa VarArgs w Rust?
W tym przykładzie chcę wydrukować liczbę wejść i wyjść, ale funkcja opakowana po prostu drukuje śmieci. Jakiś pomysł jak to naprawić?
#![allow(non_snake_case)]
#![allow(unused_variables)]
extern crate mex_sys;
use mex_sys::mxArray;
use std::ffi::CString;
use ::std::os::raw::c_int;
use ::std::os::raw::c_void;
type VarArgs = *mut c_void;
// attempt to wrap mex_sys::mexPrintf
fn mexPrintf(fmt: &str, args: VarArgs) {
let cs = CString::new(fmt).unwrap();
unsafe {
mex_sys::mexPrintf(cs.as_ptr(), args);
}
}
#[no_mangle]
pub extern "system" fn mexFunction(nlhs: c_int,
plhs: *mut *mut mxArray,
nrhs: c_int,
prhs: *mut *mut mxArray) {
let hw = CString::new("hello world\n").unwrap();
unsafe {
mex_sys::mexPrintf(hw.as_ptr());
}
let inout = CString::new("%d inputs and %d outputs\n").unwrap();
unsafe {
mex_sys::mexPrintf(inout.as_ptr(), nrhs, nlhs);
}
mexPrintf("hello world wrapped\n", std::ptr::null_mut());
let n = Box::new(nrhs);
let p = Box::into_raw(n);
mexPrintf("inputs %d\n", p as VarArgs);
let mut v = vec![3];
mexPrintf("vec %d\n", v.as_mut_ptr() as VarArgs);
}
Aktualizacja: pomyliła się variable list of arguments
z va_list
. Uniknę obu, jeśli będę mógł i w tej sytuacji, zamierzam zrobić formatowanie rdzy w Rust, zanim przejdę do współdziałania. Oto co pracował dla mnie w tym przypadku:
#![allow(non_snake_case)]
#![allow(unused_variables)]
extern crate mex_sys;
use mex_sys::mxArray;
use std::ffi::CString;
use ::std::os::raw::c_int;
// attempt to wrap mex_sys::mexPrintf
fn mexPrintf(text: &str) {
let cs = CString::new(text).expect("Invalid text");
unsafe { mex_sys::mexPrintf(cs.as_ptr()); }
}
#[no_mangle]
pub extern "C" fn mexFunction(nlhs: c_int, plhs: *mut *mut mxArray, nrhs: c_int, prhs: *mut *mut mxArray){
mexPrintf(&format!("{} inputs and {} outputs\n", nrhs, nlhs));
}
Czy masz na myśli, że mexPrintf akceptuje zmienną liczbę argumentów takich jak 'printf' lub' va_list' takich jak 'vprintf'? Jeśli poprzedni, musisz przekazać liczbę całkowitą bezpośrednio, a nie jako wskaźnik do niej. –
Dzięki @ChrisEmerson, niestety zdezorientowałem dwóch. Dziękuję za pomoc w wyjaśnieniu tego. –