Python 如何在ANSIC中完成嵌套函数的模拟,以便动态更新函数?请看完整的解释

Python 如何在ANSIC中完成嵌套函数的模拟,以便动态更新函数?请看完整的解释,python,ansi-c,Python,Ansi C,我是这个社区的新手,我想问一个问题。我不是程序员/开发者,但我使用编程来加速我的科学计算。过去我使用了很多python,但现在由于我的新工作,我需要使用C编程语言。我是新手,这有点困难,但我很挣扎:D.我的主要问题是,如何完成从python到C的这类代码: def foo(x,a): def en(x): return a*x return en 我用它来得到动态的最终方程,我可以为许多不同的例子编写我的解算器。基本上,我想在C中做同样的事情。因为ANSIC不支

我是这个社区的新手,我想问一个问题。我不是程序员/开发者,但我使用编程来加速我的科学计算。过去我使用了很多python,但现在由于我的新工作,我需要使用C编程语言。我是新手,这有点困难,但我很挣扎:D.我的主要问题是,如何完成从python到C的这类代码:

def foo(x,a):
    def en(x):
        return a*x
    return en
我用它来得到动态的最终方程,我可以为许多不同的例子编写我的解算器。基本上,我想在C中做同样的事情。因为ANSIC不支持嵌套函数,所以我不能用typdefs获得它,或者只是不知道如何做。我找了很多答案,但都没找到

提前谢谢。 PS对不起,我的英语不好,如果是:D

编辑:我忘了添加我的示例代码,我试图从中执行相同的操作:D,但我得到了错误,因为ansi C不支持嵌套函数

double fun(double x, double a){
return a*x-5;
}
double n(double x);
typedef double (*function)(double);
function wrapper(double x, double a){
    function ptr;
    double functionReturn(double x){
        return fun(a,x);
    }
    ptr = functionReturn;
    return ptr;
}

如前所述,您不能在C中动态生成函数。因此,您的方法需要有很大的不同,您如何调整它将取决于您试图实现的细节。我将展示两种替代函数返回行为的方法

方法1:如果一次只需要使用一个返回函数。 通常,如果您正在动态计算函数,那么从给定函数返回的函数将非常相似。假设一次只需要一个有效的返回函数,您可以使用静态数据存储来获得这种效果

static double fun_a;

double fun( double x )
{
   return fun_a*x - 5;
}

void wrapper( double a )
{
   fun_a = a;
}
在您的示例中,您有一个2参数函数'fun',您需要一个返回函数的函数,该函数由修复一个参数得到的fun片段给出。当您调用'wrapper(a)'时,'fun'本质上发生了变化,因此调用'fun(x)'与调用'fun(x,a)'是相同的(将第二个参数'a'与静态变量'fun_a'相关联)

基本上,“包装器”不是返回函数,而是将现有函数更改为它将返回的函数(实际上不返回任何东西)。所以你得到了同样的效果,你一次只能使用一个返回

static double fun_a;

double fun( double x )
{
   return fun_a*x - 5;
}

void wrapper( double a )
{
   fun_a = a;
}
如果您花一点时间考虑一下您想要计算函数的情况,您可能会发现,定义一个使用全局变量的函数,并通过修改这些全局变量来获得所需的函数几乎总是相当简单的

请注意,全局变量可以从程序的其他部分访问,请注意如何命名它们,以避免它们在其他地方被弄乱。如果我有一个函数“fun”,并且我定义了一些globabl来配合它,我通常将它命名为“fun_u[something]”,这样就很容易避免此类问题

最后,如果您对一次需要使用的函数数量有一个固定的小限制,您可以通过这样做来实现您的目标:

static double fun1_a;

double fun1( double x )
{
   return a*x - 5;
}

void wrapper1( double a )
{
   fun1_a = a;
}



static double fun2_a;

double fun2( double x )
{
   return a*x - 5;
}

void wrapper2( double a )
{
   fun2_a = a;
}

.
.
.
方法2:使用typedef 你举的例子很简单,我猜是因为你的情况太复杂,在实际情况下无法提出这个问题。第二种方法需要更复杂一点的示例来理解

假设你有一个函数E(x,m),它计算出x和m有多少个共同的素数因子。这是一个可能非常昂贵的函数,因此您可能需要计算一个函数F_k(m),该函数计算k和m共有多少素数因子,因为这将是一个非常快的函数。注意,E接受变量x,而k对于F_k是固定的,因此函数服务于不同的角色

这只是一个任意的例子,演示了在比简单地获取更高的算术函数的切片更复杂的情况下执行此类操作的技术

您可以执行以下操作:

typedef long long unsigned llu;
typedef llu* F_type;

int fun( F_type L, llu m )
{
   int i, j=0;
   for(i=0; L[i]; ++i)
      if( m % L[i] == 0 ) ++j;
   return j;
}

F_type wrapper( llu k )
{
   // code that returns an array listing the primes dividing k, followed by 0
}
因此,您可以简单地调用包装器(k),将结果设置为L,然后调用fun(L,m),而不是调用为给定k返回F_k的函数。然后,L扮演函数Fk的角色,本质上是将乐趣转化为Fk

这种方法的优点是,在给定时刻,任何数量的此类类型都可能在程序中处于活动状态


您的问题的真正答案是,您只需要重新构造您的方法,以使用可以在执行期间构造的数据类型。我希望这两个例子可以帮助说明在C中实现这一点的一些方法。

如前所述,您不能在C中动态生成函数。因此,您的方法需要非常不同,您如何适应它将取决于您试图完成的细节。我将展示两种替代函数返回行为的方法

方法1:如果一次只需要使用一个返回函数。 通常,如果您正在动态计算函数,那么从给定函数返回的函数将非常相似。假设一次只需要一个有效的返回函数,您可以使用静态数据存储来获得这种效果

static double fun_a;

double fun( double x )
{
   return fun_a*x - 5;
}

void wrapper( double a )
{
   fun_a = a;
}
在您的示例中,您有一个2参数函数'fun',您需要一个返回函数的函数,该函数由修复一个参数得到的fun片段给出。当您调用'wrapper(a)'时,'fun'本质上发生了变化,因此调用'fun(x)'与调用'fun(x,a)'是相同的(将第二个参数'a'与静态变量'fun_a'相关联)

基本上,“包装器”不是返回函数,而是将现有函数更改为它将返回的函数(实际上不返回任何东西)。所以你得到了同样的效果,你一次只能使用一个返回

static double fun_a;

double fun( double x )
{
   return fun_a*x - 5;
}

void wrapper( double a )
{
   fun_a = a;
}
如果您花一点时间考虑一下您想要计算函数的情况,您可能会发现,定义一个使用全局变量的函数,并通过修改这些全局变量来获得所需的函数几乎总是相当简单的

请注意,全局变量