我正在用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访问数组相关推荐

  1. python中2d_【IT专家】如何在Python中复制一个2D数组?(复制)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 如何在 Python 中复制一个 2D 数组? ( 复制 ) 如何在 Python 中复制一个 2D 数组 ?( 复制 )[ 英 ]How to  ...

  2. Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵)

    Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵) 本博客转载自:https://blog.csdn.net/vernice/article/details/50 ...

  3. 创建二维数组 以及 python中[0 ]* n与[0 for _ in range(n)]的区别与联系

    一.浅拷贝于深拷贝 关于浅拷贝于深拷贝:Python 的深拷贝和浅拷贝 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy) ...

  4. python中的二维数组_Python中的二维数组实例(list与numpy.array)

    关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要 ...

  5. python中的二维数组与一维数组,矩阵和一维数组之间的运算

    一.python中的二维数组和一维数组之间的运算 1.当二维数组为p×p维 a=np.array([[1,2],[3,4]]) print(a.shape) a 输出: (2, 2) array([[ ...

  6. python 数组 动态赋值_动态数组在Python中的实现

    动态数组 在python中,列表,集合和字典是可变对象.数字,字符串和元组是不可变的对象.可变对象意味着我们从列表,集合或字典中添加/删除项目,但是对于不可变对象(例如元组或字符串)而言,情况并非如此 ...

  7. python中序列类型和数组之间的区别_「Python」序列构成的数组

    一.Python 标准库的序列类型分为: 容器序列: 能够存放不同类型数据的序列(list.tuple.collections.deque). 扁平序列: 只能容纳一种类型的数据(str.bytes. ...

  8. python创建长度为n的数组_在Python中建立N维数组并赋初值

    在Python中,由于不像C++/Java这样的语言可以方便的用a[i][j]=0的方式,建立二维数组并赋初值,所以需要一个相对巧妙的方法. 可以用列表解析的方式,eg: >>> m ...

  9. python定义二维数组_在python中定义二维数组

    原博文 2016-08-30 19:16 − 发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段 ...

最新文章

  1. 应届硕士研究生算法岗秋招总结
  2. java消费者中url找不到,java – URL可以使用浏览器访问,但是仍然是具有URLConnection的FileNotFoundException...
  3. vc/vs开发的应用程序添加dump崩溃日志转
  4. selenium 鼠标悬浮_处理Selenium3+python3定位鼠标悬停才显示的元素
  5. 如何解决秒杀的性能问题和超卖的讨论
  6. ERROR ITMS-90206:Invalid Bundle. The bundle at ‘xx.app/xx/xx.framework' contan
  7. php列表代码怎么做的,php项目实战:代码讲解之订单列表问题
  8. 数据恢复的学习旅程开始
  9. 计算机组成原理实验基本运算器,计算机组成原理运算器实验-20210611075033.docx-原创力文档...
  10. 二叉树的遍历方法总结与c++实现
  11. HSV空间改进的多尺度Retinex算法
  12. RDPWrap远程桌面的一次脱坑
  13. restsharp text html,c# – 使用RestSharp发送HTTP POST Multipart / form-data字段
  14. 【Pygame闯关游戏】手残勿入,最新虐心游戏《见缝插针》——不得不玩的一款游戏。
  15. Adobe pr,ae,ps...软件的安装,及简单的使用
  16. VS如何安装到电脑上
  17. 信道、频段带宽等术语简介
  18. 什么是pisa测试_PISA测试很专业,但对理解什么是教育很重要
  19. 数据挖掘项目之Airbnb 新用户的民宿预定结果预测
  20. 为什么Y电容容量基本都不大于0.1uF?

热门文章

  1. Android之系统服务-WindowManager
  2. linux系统中scanf函数,Linux下scanf宽度控制问题
  3. 为什么你闻不到自己胳肢窝的味道?
  4. 现在相亲还要体检报告了?
  5. 程序员,为什么给你50万年薪,你还要搞死我公司?
  6. 快速成长为数据挖掘高手的秘诀
  7. linux cp 强制yes,linux cp实现强制覆盖
  8. python3 2.00gb怎么去掉单位_最值得期待的Python 3.9的新功能
  9. 计算机标准符合,计算机专利申请要符合哪些标准
  10. c语言程序stm8s,stm8s的c语言编程例程