a function-definition is not allowed here before '{' tokenBacground /应用程序/示例
我有一个N体程序求解器,它使用f2py,由几个函数组成(一个函数计算物体间的力,另一个函数通过RKF45集成微分方程)。
因为我发现很难让f2py在Windows下工作,而且我想要制作多平台的python库,所以我尝试将它重写为C,并使用基于本教程http://wiki.scipy.org/PerformancePython的scipy.weave
为了举例说明,我用了一个简单得多的微分方程dA(t)/dt = -k*A(t)
from scipy import weave
from scipy.weave import converters
from pylab import *
n = 100
As = zeros(n);
def testODE(A, k, n):
code = r"for (int i=0; i<n; i++) { As(i)=A; A -= (double)k*(double)A; }"
return weave.inline(code, ['A','k','n','As'], type_converters=converters.blitz, compiler = 'gcc')
ks = arange(0.02,0.2,0.02)
for k in ks:
testODE( 10.0, k, n)
plot ( As );
show();这个很好用。我只是不确定由于weave.inline()调用是否存在一些开销。
但是,如果我为求导数(如N体问题中的力)做了一个单独的函数,我就会得到误差a function-definition is not allowed here before '{' token。
def testODE_multiFunc(A, k, n):
code = r'''
double evalDerivatives(double a, double b){ return a*b; }
for (int i=0; i<n; i++) { As(i)=A; A -= evalDerivatives(k,A); }
'''
return weave.inline(code, ['A','k','n','As'], type_converters=converters.blitz, compiler = 'gcc', verbose=3) 发布于 2014-03-08 18:36:57
下面是对编译代码缓存方式的解释:编织目录
如果要内联复杂(多功能)C代码,可以在单独的头文件(例如,foo.h)中定义函数,然后将其传递给对inline的调用。
weave.inline(code, ['A','k','n','As'], headers=['"foo.h"'],
type_converters=converters.blitz)注意这个奇怪的引语。来自文档
header : str,可选字符串列表,指定在编译代码时要使用的头文件。列表看起来可能是"“、”my_header“。请注意,头字符串需要在C++代码中的#include语句末尾粘贴的表单中。
https://stackoverflow.com/questions/22270795
复制相似问题