我是编程的新手,我在c 中定义了一个函数,带有元组方法,用于两个返回的变量,在我编译文件后,在python文件中,我尝试访问两个返回的变量在已编译的动态库中,但它不起作用,当我尝试运行Python程序时,发生了分割错误。但是我实际上是从C 的单个返回变量成功的成功,我认为从Python访问两个返回的变量可能会有特殊的技巧。
以下是带有元组方法的两个返回变量的C 代码
std::tuple<double, double> Cassie2d::Step(ControllerTorque* action)
{
dyn_model_.setState(mj_data_->qpos, mj_data_->qvel);
dyn_state_.UpdateDynamicState(&dyn_model_);
mju_copy(mj_data_->ctrl, action->torques, nU);
mj_step(mj_model_, mj_data_);
return std::make_tuple(mj_data_->qacc,mj_data_->time);
Render();
}
以下是应用Python方法,由于两个返回的变量都是双型。
。lib.StepTorque.argtypes = [ctypes.c_void_p, ctypes.POINTER(ControllerTorque)]
lib.StepTorque.restype = ctypes.c_double
我猜restype
不仅等于ctypes.c_double
,因为它适用于一个返回的变量,并且可能对两个返回变量不起作用。
真的很感谢您的帮助!
使用 return std::make_tuple(mj_data_->qacc,mj_data_->time)
创建一个结构,该结构容纳两个变量,在括号中定义。如果将来自本机C 代码调用该函数,则应该可以使用std:tie,等式:
double a, b;
std::tie(a,b) = Step(arg);
但是,您需要直接从Python调用它,该语法完全不同,用于返回多个变量(C 对或元组是旁路缺少功能)。我在Python中看到了两个选项。
将您的C 函数两个回调给Python,并以这种方式分别发送变量:
void Cassie2d::Step(ControllerTorque* action, callback1, callback2) { dyn_model_.setState(mj_data_->qpos, mj_data_->qvel); dyn_state_.UpdateDynamicState(&dyn_model_); mju_copy(mj_data_->ctrl, action->torques, nU); mj_step(mj_model_, mj_data_); callback1(mj_data_->qacc); callback2(mj_data_->time); Render(); }
(建议)您可以尝试使用本机Python选项来服务多重返回。剩下的C 功能以其初始形式,然后以Python致电:
VarA, VarB = Step(action)
我假设您在Python代码中对
Cassie2d::Step(ControllerTorque* action)
方法有参考,但是您提供了很小的片段。