问题描述
我想用Rust编写一款适用于旧游戏的AI。此游戏的AI是库,在Linux端口中,它只是一个.so
文件导出:
extern "C" void client(int Command,int Player,void *Data);
void *Data
可以是struct(取决于Command
)或此函数:
typedef int TServerCall(int Command,int Subject,void *Data);
在C ++中,AI代码根据命令将其强制转换为已知大小或回调的结构,例如:
typedef int __stdcall TServerCall(int Command,void *Data);
或构造:
// where G is a extern TNewGameData G;
G = *(TNewGameData *) Data;
然后我可以访问G
或其他结构或数组的字段。
问题:
如何将数据以void *
的形式强制转换为Rust的结构或函数?
解决方法
您可以在Rust中强制转换原始指针。
use libc::{c_void,c_int};
#[repr(C)]
struct TNewGameData {
// the fields go here
}
#[no_mangle]
pub extern "C" fn client(command: c_int,player: c_int,data: *mut c_void) {
// Cast raw pointer to the right type.
let game_data_ptr = data as *mut TNewGameData;
// Convert to Rust reference.
let game_data = unsafe { &mut *data };
}