mexPrintf
,就像printf
一樣,接受參數的可變參數列表。我不知道什麼是最好的方式來包裝在Rust。有一個RFC for variadic generics,但我們今天能做什麼?如何將調用包裝到在Rust中使用VarArgs的FFI函數?
在這個例子中,我想打印輸入和輸出的數量,但是打包函數只是打印垃圾。任何想法如何解決這個問題?
#![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);
}
更新:我混淆了一個variable list of arguments
與va_list
。如果可以的話,我會盡量避免這兩種情況,在這種情況下,我只需在Rust中進行字符串格式化,然後再將它傳遞給interop。下面是我在這種情況下,什麼工作:
#![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));
}
你的意思是mexPrintf接受像'printf'這樣的可變數量的參數,或者''vprintf''這樣的'va_list'?如果前者需要直接傳遞整數而不是指向它的指針。 –
謝謝@ChrisEmerson,我很遺憾地感到困惑。感謝您幫助解決問題。 –