mexPrintf
, printf
gibi, bir varargs argüman listesi kabul eder. Bunu Rust'ta sarmanın en iyi yolunun ne olduğunu bilmiyorum. RFC for variadic generics var, ama bugün ne yapabiliriz?Çağrı, Rust'ta VarArgs kullanan bir FFI işlevine nasıl sarılır?
Bu örnekte, giriş ve çıkışların sayısını yazdırmak istiyorum, ancak sarılmış işlev yalnızca çöpleri yazdırıyor. Bunu düzeltmek için bir fikrin var mı?
#![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);
}
Güncelleme: Ben va_list
ile variable list of arguments
karıştı almıştı. Her ikisinden de kaçınacağım ve eğer bu durumda, Rust'u dizgiye dönüştürmeden önce dizgeyi formatlamak istiyorum. İşte bu durumda benim için çalıştı budur:
#![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));
}
Sanılanın aksine
mexPrintf, "printf" veya "va_list" gibi "vprintf" gibi değişken sayıda bağımsız değişken kabul ediyor mu? Birincisi, tamsayıya bir işaretçi olarak değil, doğrudan geçmeniz gerekiyorsa. –
Teşekkürler @ChrisEmerson, ne yazık ki iki kafası karıştı. Bunu temizlemeye yardım ettiğiniz için teşekkürler. –