gpt4 book ai didi

c++ - 如何在Rust中将C/C++ void *取消引用以进行结构化或回调?

转载 作者:行者123 更新时间:2023-12-02 10:09:18 25 4
gpt4 key购买 nike

我想用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 Player, int Subject, void *Data);
在C++中,AI代码根据命令将其强制转换为已知大小或回调的结构,例如:
typedef int __stdcall TServerCall(int Command, int Player, int Subject, 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 };
}

关于c++ - 如何在Rust中将C/C++ void *取消引用以进行结构化或回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64285303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com