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?在
總結
以上是生活随笔為你收集整理的python3调用c语言数组,使用Python中的ctypes访问数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拔罐、刮痧后多久能洗澡
- 下一篇: android应用窗口模式,[技巧]如何