Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写函数来接受SWIG中的分数对象? 我在使用Pythg编写Python和我们的C++视频处理库之间的接口。在python中,我使用分数类来表示帧速率(例如NTFS24=24000/1001 FPS)。所讨论的功能是视频转码,即获取视频(或帧流)输入并产生类似输出。为此,我们需要指定输出(有时输入)帧速率 有什么方法可以在C++(SWIG)侧接口分数类?根据我在互联网上的发现,我应该能够将tuple传递给std::pair参数,这就是我的后备计划,但是有更好的方法吗?谢谢_Python_C++_Swig_Fractions - Fatal编程技术网

如何编写函数来接受SWIG中的分数对象? 我在使用Pythg编写Python和我们的C++视频处理库之间的接口。在python中,我使用分数类来表示帧速率(例如NTFS24=24000/1001 FPS)。所讨论的功能是视频转码,即获取视频(或帧流)输入并产生类似输出。为此,我们需要指定输出(有时输入)帧速率 有什么方法可以在C++(SWIG)侧接口分数类?根据我在互联网上的发现,我应该能够将tuple传递给std::pair参数,这就是我的后备计划,但是有更好的方法吗?谢谢

如何编写函数来接受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:我们应该

我将下面的接口文件放在一起,以说明如何包装分数。最后,我决定创建我自己的分数结构,以在C++侧保存分数,主要是因为它比使用<代码> STD::配对< /Cuff>模糊得多。(我认为一对整数也可以是二维坐标、屏幕分辨率或许多其他类型,对于超负荷分辨率等来说,更强大的输入效果更好。)

%模块测试
%{
#包括//仅用于测试。。。。
静态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;
  }
%}