我正在用C编写一个ode解算器,导出到一个WindowsDLL和一个DLL的Python包装器。我非常习惯Python,但我对C和ctypes也是一个完全的初学者。在
受公认答案here启发的修改后的解决方案如下所示:
C代码
/* my_clib.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
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)
,你得到<class '__main__.LP_c_double'>
,但如果你试图访问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?在
您可以使用^{} 。在
只有一点issue使用不同形状的同一指针。在
要从作用于int、long等的ctypes对象访问值,请使用:
所以,您可以迭代它们并生成数组。在
另外,您可以将一个清晰的C静态数组传递给Python而不是使用结构,并使用numpy的cypes支持来获得努比·恩达雷,或使用Python的数组模块。在
但是,我用这个结构明白你的意思。这些都是简单明了的方法。在
相关问题 更多 >
编程相关推荐