mexPrintf
は、printf
のように、引数の可変リストを受け入れます。私は、これをラストで包む最良の方法が何かを知りません。 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);
}
アップデート:私はva_list
とvariable list of arguments
を混同していました。私はこの状況で両方を避けるつもりですが、私はちょうどそれをinteropに渡す前にRustで文字列フォーマットを行うつもりです。ここでは、この場合には私のために働いていたものです:
#![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'や' vprint_'のような 'va_list'のような可変数の引数を受け入れることを意味しますか?前者の場合は、整数へのポインタではなく直接渡す必要があります。 –
ありがとう@ChrisEmerson、私は悲しげに2つを混乱させる。それをクリアするのを助けてくれてありがとう。 –