SWIG有一个简单规则就是
Everything else is a pointer
即除了基本的类型以外的其他数据类型,swig全部通过指针来处理。大致过程就是将操作C/C++中的结构,类,数组等是通过操作指向这些数据的指针操作,封装成python的数据也是一个包含指针信息的python对象。
C/C++的指针在python中是通过一个特殊的对象来保存的,在python中的变量保存的C/C++的数组以及类对象其实就是保存的这些指针对象,然后封装函数也是操作指针来操作真正的结构和数组等对象。
Read More
由于之前看的是《Python科学计算》上面关于swig的简单介绍,上面说了如何在python中如何像类一样的使用C结构,但是也只是停留在如何使用结构的成员数据上,但是没有讲如何将C的函数封装成python的类方法的方法。相反由于C++有原生OOP的支持,固然swig直接可以将C++的类封装成python的类。所以我以前一直认为这时候只能用C++了。
但其实,还是读书读的少啊。swig这么强大的封装工具,这早就想到了。毕竟OO是一种思想,C照样能写出OO的代码来(多重继承和多态这种行么?)。
所以今天看到swig文档中关于%extend
指令的介绍才感觉相见恨晚啊。
Read More
这不是我最早使用swig了,之前在写Kynetix的时候就使用了swig为python封装了C语言写的扩展模块。但是当时我对C++还不是很了解,对其中的一些概念也只是拿来直接用,没有理解到底是什么,为什么会有这种功能。所以昨天我又拿出了《python科学计算》这本书来温习了一下swig那一部分,果然对swig又有了新的认识。
对swig真正全的使用都在swig的文档中有详细的介绍,而且由于swig支持很多种语言,例如java、python、Tcl等,因此这份文档内容相当的丰富。由于现在还没有很好的中文资源,所以现在只能默默的看英文文档了。
Read More
这个类算是KMCLib中最后一个大类了,也回答了我在看代码之初有的很多疑问,例如如何更新匹配相关的信息,如何更新事件列表等。
这个类是没有成员数据的,可以把Matcher
类看作是与匹配相关的函数的封装。
但是在头文件中却定义了两个相关的结构来存储操作信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| struct RateTask { int index; int process; double rate; };
struct RemoveTask { int index; int process; };
|
Read More
之前在看代码的时候就发现了这个问题,就是在初始化configuration的match_lists的时候,最后一步是为configuration分配内存空间,但是作者使用的是match_lists中的第一个minimal_match_list的长度来分配内存,这样就留下了数组越界的隐患,我写了个单元测试,测试了下,果然!
因为由于周期性边界条件的原因,第一个minimal_match_list可能并不是长度最长的
于是我就向leetmaa/KMCLib的主分支提交了自己的代码,今天他接受了我的pull requests。具体的pull request信息以及我做的bug修复就不多扯了,贴上github上的链接来好了:
Fix the out-of-bound bug by PytLab · Pull Request #5 · leetmaa/KMCLib
Read More