- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 SWIG 的工作原理。假设我有这个简单的 Foo-Bar 类:
#include <vector>
class Bar {
public:
Bar();
~Bar();
int bar_data;
};
class Foo {
public:
// does not take ownership.
Foo(std::vector<Bar>* b) { b_ = b; }
private:
std::vector<Bar>* b_;
};
假设我传递给 Foo 的 vector 很大,所以我不想复制它,只复制指针。在我的 C++ 应用程序中,我将确保注入(inject)到 Foo 的参数(即 b)比我用它创建的 Foo 实例长寿。我如何在 SWIG for python 中执行此操作?我试着写我的类型图(我想我可以使用模板,但这能解决问题吗?我想使用类型图来理解它)。这是 swig 文件:
%module example
%{
#include "example.h"
%}
%typemap(in) std::vector<Bar>* b (std::vector<Bar> temp) {
PyObject* input = $input;
if (!PyList_Check(input)) {
SWIG_exception(SWIG_TypeError, "Input must be a list");
}
for (int i = 0; i < PyList_Size(input); ++i) {
PyObject* obj = PyList_GetItem(input, i);
Bar* bar;
if (SWIG_ConvertPtr(obj, (void**)&bar, $descriptor(Bar), 1) == -1) {
SWIG_exception(SWIG_TypeError, "Input list element was not a Bar");
}
temp.push_back(*bar);
}
$1 = &temp;
}
然而,当我查看生成的代码时,我看到了可能出现问题的地方:
SWIGINTERN PyObject *_wrap_new_Foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
std::vector< Bar > *arg1 = (std::vector< Bar > *) 0 ;
std::vector< Bar > temp1 ;
PyObject * obj0 = 0 ;
Foo *result = 0 ;
if (!PyArg_ParseTuple(args,(char *)"O:new_Foo",&obj0)) SWIG_fail;
{
PyObject* input = obj0;
if (!PyList_Check(input)) {
SWIG_exception(SWIG_TypeError, "Input must be a list");
}
for (int i = 0; i < PyList_Size(input); ++i) {
PyObject* obj = PyList_GetItem(input, i);
Bar* bar;
if (SWIG_ConvertPtr(obj, (void**)&bar, SWIGTYPE_Bar, 1) == -1) {
SWIG_exception(SWIG_TypeError, "Input list element was not a Bar");
}
temp1.push_back(*bar);
}
arg1 = &temp1;
}
result = (Foo *)new Foo(arg1);
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Foo, SWIG_POINTER_NEW | 0 );
return resultobj;
fail:
return NULL;
}
也就是说,Foo* 类型的结果是使用指向局部变量 (arg1 = &temp1
) 的指针创建的。这看起来是错误的。无论如何我可以正确地做到这一点吗?我是 SWIG 的新手,因此指向解决此问题的文档的指针也很有用。
我是否可以在不更改 C++ 接口(interface)的情况下至少模拟构造函数参数的拷贝?也就是说,创建 python Foo(my_list_of_bars)
将表现得好像要包装的 c++ 代码是 Foo(std::vector<Bar> b)
.我认为我可以在类型映射中做的一件事是使用临时指针,从 python 列表中复制值,然后将其传递给 Foo。所以第一行会变成:
%typemap(in) std::vector<Bar>* b (std::vector<Bar> *temp) {
temp = new std::vector<Bar>;
但是我怎样才能清理生成的代码中的临时文件?
最佳答案
如您所见,尝试传递 Python 列表只会创建一个临时的 std::vector 来调用 Foo 构造函数。要创建一个可以管理其生命周期的永久类,请将 std::vector 类公开给 Python,构建一个,然后传递它:
例子:
%module x
%{
#include <vector>
%}
%inline %{
struct Bar {
int data;
};
%}
%include <std_vector.i>
%template(BarVec) std::vector<Bar>;
%inline %{
class Foo {
std::vector<Bar>* b_;
public:
// does not take ownership.
Foo(std::vector<Bar>* b) { b_ = b; }
std::vector<Bar>* get() { return b_; } # Added to inspect that it worked.
};
%}
演示:
>>> import x
>>> v = x.BarVec()
>>> for i in range(10):
... b = x.Bar()
... b.data = i
... v.push_back(b)
...
>>> f = x.Foo(v)
>>> v2 = f.get()
>>> v[5].data
5
>>> v2[5].data
5
>>> v[5].data = 7 # Change original vector data passed in.
>>> v2[5].data # vector from Foo also changes.
7
>>> del v # delete the original vector
>>> v2 # proxy is still there
<x.BarVec; proxy of <Swig Object of type 'std::vector< Bar > *' at 0x00000000027CA4C0> >
>>> v2[0] # <CRASH>
关于python - 痛饮 python : inject pointer on construction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22364395/
按照此页面上的教程:https://cdkworkshop.com/20-typescript/40-hit-counter/300-resources.html 我相信this ,传递给 Table
据我所知std::allocator::construct在旧版本的 C++ 上仅需要两个参数;第一个是指向原始的、未构造的内存的指针,我们要在其中构造 T 类型的对象。第二个是用于初始化该对象的元素
我正在阅读 CanJS API 文档并遇到 can.Construct.extend http://canjs.com/docs/can.Construct.extend.html .我知道 can.
考虑 struct C { C() { printf("C::C()\n" ); } C(int) { printf("C::C(i
阅读 git repo 中截取的以下代码时遇到一些问题。链接到存储库和问题: https://github.com/paolo-sz/fatty/blob/master/src/winmain.c#L
除了将一种高级语言转换为另一种高级语言的编译器之外,任何编译为机器代码的编译器都需要用汇编编写吗? 最佳答案 编译器的源代码不需要用汇编语言编写。例如,CPython 编译器(好吧,技术上解释器)的(
我正在努力计算 worklist算法,我不想实现迭代算法,因为它需要很多冗余步骤。 我用来计算实时变量工作列表的算法如下 任何人都可以为下面给出的示例向我解释一下,初始工作列表是什么以及工作列表算法将
我有这部分语法 S ‐> S a | S b a | a | S b c S | S b c b | c S | c b 我需要使用它来创建一些 SD 集,然后在解析表上使用它。 但是,在此之前,我应
是否有人引用了有关着色器编译器/图形驱动程序编译器内部工作原理的文档和研究? 最佳答案 编写一个普通的 C 编译器和编写一个着色器编译器没有太大的区别。编写编译器的标准书是所谓的“龙书”: http:
请问有没有人能给我解释一下句法导向的切线线性码和伴随码的区别。 它与使用编译器推导代码有关。 我知道它们是在程序中推导数学方程式的不同方法,但是,我不知道如何解释它们。 提前致谢。 问候。 最佳答案
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
在编译器数据流分析中,变量的有效范围与其达到定义之间有什么区别?两者似乎都指的是同一件事... 最佳答案 它们是完全不同的东西,我建议您回过头来重新阅读那些使您感到困惑的定义。除其他事项外,对于使用给
我目前正在为一种非常有限的面向对象语言开发编译器。我想将所有值视为对象,这些值上的运算符将作为方法实现。编译器将程序转换为基于堆栈的虚拟机的汇编程序。 在编译期间,我将整数文字转换为特殊“整数”类的对
给定抽象语法树,我被要求编写一个程序来构建输入程序代码的数据流图。我在网上搜索数据流图的定义,发现一个代码段的数据流分析有很多事情要做。我想知道为给定代码构建数据流图到底需要绘制什么。很感谢任何形式的
一些随机的想法捕获了我,我就是无法摆脱它。我在想,既然现代处理器只是不同种类汇编语言的解释器,那么有没有办法创建一些直接在硬件中实现的高级语言解释器,使用一些 HDL 甚至直接使用逻辑门设计? 同时我
出现在代码生成的寄存器分配阶段的寄存器溢出或溢出代码是什么意思,编译器后端必须将变量分配到内存或寄存器? 最佳答案 Hardware registers是昂贵的(在芯片面积和寻址它们所需的指令位数方面
如果您的 bootstrap 语言编译器运行良好且可维护,为什么要更改它?例如,Go 在 1.5 版本中将其编译器重新编写为自托管,导致 compile times to become much sl
我在 Python Lisp 编译器和一些 C 链接器的源代码中看到了这个术语。 我的猜测是,修复只是 assembly 例程的一些包装,可确保对齐正确,但我对这里的任何事情都不确定。 最佳答案 “修
我对 VM 在运行时和编译时的优化感兴趣。我认为优化在编译时是最有效和最简单的。 然而,我的想法在某些情况下似乎是错误的。这在 Steve Yeggie's statement quoted by D
如果您正在构建一个编译器,那么在 AST 级别进行哪种优化是最好的? 最佳答案 大多数情况下,您无法在 AST 级别进行有趣的优化,因为您需要有关数据如何从程序的一个部分流向另一部分的信息。虽然数据流
我是一名优秀的程序员,十分优秀!