a function-definition is not allowed here before '{' token
Bacground / application / example
我有一个使用 f2py 的 N-Body 探测器求解器,它由几个函数组成(一个函数评估物体之间的力,其他函数通过RKF45积分微分方程)。
因为我发现很难在Windows下使f2py工作而且我想制作多平台python库,我正在尝试将其重写为C并使用基于本教程的 scipy.weave http://wiki.scipy.org/PerformancePython
为了说明,我用更简单的微分方程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-Body问题中的力)制作一个单独的函数,而不是我得到错误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)
答案 0 :(得分:2)
以下是有关如何缓存已编译代码的说明:the weave catalog
如果要内联复杂(多功能)C代码,可以在单独的头文件(例如foo.h
)中定义函数,然后将其传递给inline
的调用:
weave.inline(code, ['A','k','n','As'], headers=['"foo.h"'],
type_converters=converters.blitz)
注意奇怪的引用。来自docs:
headers:[str],optional指定头文件的字符串列表 在编译代码时使用。列表可能看起来像 [ “”, “ 'my_header'”]。请注意,标题字符串需要在 一个表格,可以粘贴在#include语句的末尾 C ++代码。