相关疑难解决方法(0)

为什么函数可以修改调用者所感知的某些参数,而不是其他参数?

我正在尝试理解Python的变量范围方法.在这个例子中,为什么f()能够改变x内部感知main()的价值,而不是价值n

def f(n, x):
    n = 2
    x.append(4)
    print('In f():', n, x)

def main():
    n = 1
    x = [0,1,2,3]
    print('Before:', n, x)
    f(n, x)
    print('After: ', n, x)

main()
Run Code Online (Sandbox Code Playgroud)

输出:

Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After:  1 [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

python

167
推荐指数
5
解决办法
12万
查看次数

C到Python通过SWIG:无法获取void**参数来保存它们的值

我有一个看起来像这样的C接口(简化):

extern bool Operation(void ** ppData);
extern float GetFieldValue(void* pData);
extern void Cleanup(p);
Run Code Online (Sandbox Code Playgroud)

使用如下:

void * p = NULL;
float theAnswer = 0.0f;
if (Operation(&p))
{
   theAnswer = GetFieldValue(p);
   Cleanup(p);
}
Run Code Online (Sandbox Code Playgroud)

您将注意到Operation()分配缓冲区p,GetFieldValue查询p,以及Cleanup释放p.我对C接口没有任何控制权 - 该代码在其他地方被广泛使用.

我想通过SWIG从Python调用这段代码,但是我无法找到如何将指针传递给指针的任何好例子 - 并检索它的值.

我认为正确的方法是使用类型映射,所以我定义了一个接口,它会在C端为我自动取消引用p:

%typemap(in) void** {
   $1 = (void**)&($input);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用以下python代码:

import test
p = None
theAnswer = 0.0f
if test.Operation(p):
   theAnswer = test.GetFieldValue(p)
   test.Cleanup(p)
Run Code Online (Sandbox Code Playgroud)

在调用test.Operation()之后,p始终保持其初始值None.

任何帮助找出在SWIG中执行此操作的正确方法将非常感激.否则,我可能只是围绕C代码编写一个C++包装器,阻止Python处理指针.然后使用SWIG 包装包装器.有人阻止我!

编辑:

感谢Jorenko,我现在拥有以下SWIG界面:

% module Test 
%typemap (in,numinputs=0) void** (void *temp)
{ …
Run Code Online (Sandbox Code Playgroud)

c python swig word-wrap

8
推荐指数
1
解决办法
2565
查看次数

标签 统计

python ×2

c ×1

swig ×1

word-wrap ×1