如何编写函数来接受SWIG中的分数对象? 我在使用Pythg编写Python和我们的C++视频处理库之间的接口。在python中,我使用分数类来表示帧速率(例如NTFS24=24000/1001 FPS)。所讨论的功能是视频转码,即获取视频(或帧流)输入并产生类似输出。为此,我们需要指定输出(有时输入)帧速率 有什么方法可以在C++(SWIG)侧接口分数类?根据我在互联网上的发现,我应该能够将tuple传递给std::pair参数,这就是我的后备计划,但是有更好的方法吗?谢谢
我将下面的接口文件放在一起,以说明如何包装分数。最后,我决定创建我自己的分数结构,以在C++侧保存分数,主要是因为它比使用<代码> STD::配对< /Cuff>模糊得多。(我认为一对整数也可以是二维坐标、屏幕分辨率或许多其他类型,对于超负荷分辨率等来说,更强大的输入效果更好。)如何编写函数来接受SWIG中的分数对象? 我在使用Pythg编写Python和我们的C++视频处理库之间的接口。在python中,我使用分数类来表示帧速率(例如NTFS24=24000/1001 FPS)。所讨论的功能是视频转码,即获取视频(或帧流)输入并产生类似输出。为此,我们需要指定输出(有时输入)帧速率 有什么方法可以在C++(SWIG)侧接口分数类?根据我在互联网上的发现,我应该能够将tuple传递给std::pair参数,这就是我的后备计划,但是有更好的方法吗?谢谢,python,c++,swig,fractions,Python,C++,Swig,Fractions,我将下面的接口文件放在一起,以说明如何包装分数。最后,我决定创建我自己的分数结构,以在C++侧保存分数,主要是因为它比使用 STD::配对< /Cuff>模糊得多。(我认为一对整数也可以是二维坐标、屏幕分辨率或许多其他类型,对于超负荷分辨率等来说,更强大的输入效果更好。) %模块测试 %{ #包括//仅用于测试。。。。 静态PyObject*模块=NULL; %} %初始%{ //导入我们想要的模块 分数\模块=PyImport \输入模块(“分数”); 断言(U模块); //TODO:我们应该
%模块测试
%{
#包括//仅用于测试。。。。
静态PyObject*模块=NULL;
%}
%初始%{
//导入我们想要的模块
分数\模块=PyImport \输入模块(“分数”);
断言(U模块);
//TODO:我们应该在卸载模块时调用Py_DECREF(分数模块)
%}
%类型映射(in)常量分数和分数tmp{
//分数的输入类型映射:属性分子、分母上的duck类型
PyObject*numerator=PyObject_GetAttrString($input,“分子”);
PyObject*分母=PyObject_GetAttrString($input,“分母”);
int err=SWIG_AsVal_int(分子和tmp.分子);
assert(SWIG_IsOK(err));//TODO:正确的错误处理
err=SWIG_AsVal_int(分母和tmp.分母);
断言(SWIG_IsOK(err));//TODO:错误。。。
Py_DECREF(分子);
Py_DECREF(分母);
$1=&tmp;
}
%类型映射(输出)分数{
//输出类型映射:将两个整数传递到分数中。分数()向量
$result=PyObject\u CallMethod(分数模块,“分数”,“ii”,“1.分子,$1.分母);
}
%内联%{
结构分数{
整数分子、分母;
};
空隙率_in(常数分数和分数){
STD::在C++中定义一个相应的分数类是很容易的,如果你想的话,把Python映射到一个。C++库已经做了什么?我更新了这个问题来指定功能,库现在几乎需要我们,但是现在只需要一个浮点FPS。如果你说的是一个映射,那它会是什么?允许我们在python端传递一个Fraction
对象,并获得相应的对象(属于std::pair
或自定义类)在C++上,这可能是我们想要的。你能链接一些doc如何做这样的映射吗?谢谢!如果C++函数取了一个浮点,那么你就可以通过它来浮点。我可以在SWIG中编写分数的类型映射,但是它不会被应用,或者如果C++函数只把浮点作为输入,它就必须转换成浮点。担心浮点数,我本来打算进行更改,使其采用std::pair
,至少为其提供元组接口!我没有足够清楚地表明该库是我们的(因此,如果必要,我可以对其进行更改),噢!好吧,我今天晚些时候会写一个答案,希望如此。非常感谢,我将在本周晚些时候尝试!效果很好,非常感谢!不过有一个小问题,我应该在哪里发布加载的分数模块?我现在理解init
块,但我没有发现任何类似的“分解”注释我可以放在哪里…(抱歉耽搁!)这是一个好问题,我不确定。我会看看我是否能找到它。最坏的情况下,我想你可以使用一个唯一的ptr
。这可能对某人有用:%typemap(typecheck,priority=SWIG\u typecheck\u DOUBLE)xyz::分数{$1=PyObject\u hasaststring($input,“分子”)&&PyObject_HasAttrString($input,“Denominor”);}
(我花了一段时间把它组合起来:)
%module test
%{
#include <iostream> // Just for testing....
static PyObject *fractions_module = NULL;
%}
%init %{
// Import the module we want
fractions_module = PyImport_ImportModule("fractions");
assert(fractions_module);
// TODO: we should call Py_DECREF(fractions_module) when our module gets unloaded
%}
%typemap(in) const Fraction& (Fraction tmp) {
// Input typemap for fraction: duck-type on attrs numerator, denominator
PyObject *numerator = PyObject_GetAttrString($input, "numerator");
PyObject *denominator = PyObject_GetAttrString($input, "denominator");
int err = SWIG_AsVal_int(numerator, &tmp.numerator);
assert(SWIG_IsOK(err)); // TODO: proper error handling
err = SWIG_AsVal_int(denominator, &tmp.denominator);
assert(SWIG_IsOK(err)); // TODO: errors...
Py_DECREF(numerator);
Py_DECREF(denominator);
$1 = &tmp;
}
%typemap(out) Fraction {
// Output typemap: pass two ints into fractions.Fraction() ctor
$result = PyObject_CallMethod(fractions_module, "Fraction", "ii", $1.numerator, $1.denominator);
}
%inline %{
struct Fraction {
int numerator, denominator;
};
void fraction_in(const Fraction& fraction) {
std::cout << fraction.numerator << "/" << fraction.denominator << "\n";
}
Fraction fraction_out() {
Fraction f = {100, 1};
return f;
}
%}