python3调用c语言数组,使用Python中的ctypes访问数组

我正在用C编写一个ode解算器,导出到一个WindowsDLL和一个DLL的Python包装器。我非常习惯Python,但我对C和ctypes也是一个完全的初学者。在

受公认答案here启发的修改后的解决方案如下所示:

C代码/* my_clib.c */

#include

#include

#include

struct data {

int nr_steps;

double dt;

double* t;

double* x;

double t0, x0;

};

double fun_to_integrate(double t, double y){

return (y - t);

}

double rk4(double t, double y, double dt){

double k1 = dt * fun_to_integrate(t, y),

k2 = dt * fun_to_integrate(t + dt / 2, y + k1 / 2),

k3 = dt * fun_to_integrate(t + dt / 2, y + k2 / 2),

k4 = dt * fun_to_integrate(t + dt, y + k3);

return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6;

}

__declspec(dllexport) void my_fun(struct data* pointer){

int i;

double dt;

dt = pointer->dt;

pointer->t[0] = pointer->t0;

pointer->x[0] = pointer->x0;

for(i = 1; i < pointer->nr_steps; i++){

pointer->t[i] = dt*i + pointer->t0;

pointer->x[i] = rk4(pointer->t[i-1], pointer->x[i-1], dt);

}

}

使用相应的Python文件

^{pr2}$

在Windows 8上使用MinGW用gcc -o -c my_clib.o my_clib.c+gcc -o rk4.dll -shared my_clib.o编译。在

一切运行良好,在最后一行solver.func()之后,时间数据和解决方案数据存储在data.t和data.x。现在我需要从指针访问计算的数据。似乎不能直接做。如果你做type(data.x),你得到,但如果你试图访问type(data.x[i]),你会得到一个标准double。在

{cmd}每一次,{cds}都会使文件崩溃。不过,我认为x_python = [data.x[i] for x i in range(*number_of_elements*)]可以工作,但是如果数组很长,则速度非常慢。在

我的问题是:访问C-solver计算的数据的正确/最佳方式是什么?在

另外,如果这不是将数组从C传递到Python的最佳方法,那么还有什么其他方法适合这种应用程序?一、 对于每一个时间步,或者可能在到达最后一个时间之后,将解决方案(t, x)(元组或两个数组)从C传递到Python?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值