存储在struct中的SWIG调用函数指针 [英] SWIG call function pointers stored within struct

查看:134
本文介绍了存储在struct中的SWIG调用函数指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的结构如下:

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,以便我可以运行单元测试.

There are multiple power models that my code contains. I would like to wrap these models with SWIG and expose them to Python so that I can run my unit tests.

尽管SWIG文档讨论了公开函数指针,但并未讨论结构中包含的函数指针. 我试图将调用封装在接口文件中

While the SWIG documentation talks about exposing function pointers, it does not talk about function pointers contained within structs. I tried to encapsulate the calls in my interface file

%{
#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为字段名称添加前缀.

I also tried prefixing the field names with %constant.

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

With these approaches, I always end up with the same error:

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中包含的函数指针引用的基础函数?

How can I call the underlying functions referenced by the function pointers contained within struct power_model?

修改: 为了详细说明我的设置,我还提供了两个附加文件,以更好地说明我正在尝试通过power_model界面实现的设置.

Edit: To elaborate on my setup, I am also sources of two additional files to better explain the setup I'm trying to achieve with the 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是首选方案.

This works for me. The solution 5 is the preferred one.

test.i

%module test

%{
#include "test.h"
%}

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

%include "test.h"    

test.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是一个以函数指针作为参数的函数

f is a function taking a function pointer as argument

这篇关于存储在struct中的SWIG调用函数指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆