gpt4 book ai didi

python - SWIG 调用存储在结构中的函数指针

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:18 25 4
gpt4 key购买 nike

我有一个结构如下:

struct power_model {
int64_t (*estimate_energy)(statistics *stats, statistics *scaled_stats, parameters *from, parameters *to, energy_container *energy_container);
int64_t (*estimate_performance)(statistics *stats, parameters *params);
uint32_t (*freq_to_volt)(uint32_t freq);
};

我的代码包含多个电源模型。我想用 SWIG 包装这些模型并将它们暴露给 Python,以便我可以运行我的单元测试。

虽然 SWIG 文档讨论了公开函数指针,但并未讨论结构中包含的函数指针。我试图将调用封装在我的接口(interface)文件中

%{
#include "models.h"
%}

%include "models.h"

%extend power_model {
%pythoncallback;
int64_t (*estimate_energy)(statistics *stats, statistics *scaled_stats, parameters *from, parameters *to, energy_container *energy_container);
int64_t (*estimate_performance)(statistics *stats, parameters *params);
uint32_t (*freq_to_volt)(uint32_t freq);
%nopythoncallback;
}

我还尝试在字段名称前加上 %constant 前缀。

使用这些方法,我总是会遇到同样的错误:

In [3]: model.estimate_energy()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-b2e3ace2fc9b> in <module>()
----> 1 model.estimate_energy()

TypeError: 'SwigPyObject' object is not callable

如何调用 struct power_model 中包含的函数指针引用的底层函数?

编辑:为了详细说明我的设置,我还提供了两个附加文件的来源,以更好地解释我试图通过 power_model 接口(interface)实现的设置。

nexus5.c

static int64_t estimate_energy(statistics *stats, statistics *scaled_stats, parameters *from, parameters *to, energy_container *energy) {
...
}
static int64_t estimate_performance(statistics *stats, parameters *params) {
...
}
static uint32_t freq_to_volt(uint32_t freq) {
...
}

struct power_model nexus5_power_model = {
.estimate_energy = estimate_energy,
.estimate_performance = estimate_performance,
.freq_to_volt = freq_to_volt,
};

galaxy_s.c

static int64_t estimate_energy(statistics *stats, statistics *scaled_stats, parameters *from, parameters *to, energy_container *energy) {
...
}
static int64_t estimate_performance(statistics *stats, parameters *params) {
...
}
static uint32_t freq_to_volt(uint32_t freq) {
...
}

struct power_model galaxy_s_power_model = {
.estimate_energy = estimate_energy,
.estimate_performance = estimate_performance,
.freq_to_volt = freq_to_volt,
};

最佳答案

这对我有用。方案5是首选方案。

测试.i

%module test

%{
#include "test.h"
%}

// Solution 5 (right one)
%pythoncallback;
double f5(double);
%nopythoncallback;
%ignore f5;

%include "test.h"

测试.h

typedef double (*fptr_t)(double);

// Solution 5
double f5(double x) {
return x*x;
}

typedef struct bla {
fptr_t f;
} bla;

从 Python 内部

import test
s = test.bla
# Assign function pointer
s.f = test.f5
# Execute
s.f(2)

f 是一个以函数指针为参数的函数

关于python - SWIG 调用存储在结构中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com