函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)

Posted

技术标签:

【中文标题】函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)【英文标题】:lost value in array pointers among functions (compiled with swig to use in python3) 【发布时间】:2017-09-13 02:15:47 【问题描述】:

我不明白为什么值会从 func1 丢失到 func2 再到 main。它在 func1 中打印正常,但在 func2 和 main 中失败。 我觉得不是swig问题,更像是c++代码问题~可以用下面的代码重现问题。

我的 test.cpp:

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <mutex>
#include "test.h"
void test::func1(float* feat) 
    std::vector<float> fv = 1,2,3,4,5,6,7;
    feat = fv.data();
    for (std::size_t i = 0; i < 7; ++i)
    std::cout <<  *feat << std::endl;
    feat++;
    



bool test::func2(float* feat) 
    test::func1(feat);

bool test::main(float* feat)
    test::func2(feat);
    for (std::size_t i = 0; i < 7; ++i)
    std::cout <<  *feat << std::endl;
    feat++;
    

我的测试.h:

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <mutex>

class test 
public:
    void func1(float* feat);
    bool func2(float* feat);
    bool main(float* feat);
;

我的测试.i:

%module test
%
#define SWIG_FILE_WITH_INIT
#include "test.h"
%

%include "carrays.i"
%array_functions(float, floatArray); 

%include <std_string.i>
%include "test.h"

当我在 python3 中测试时:

>>> from test import test, new_floatArray, floatArray_getitem
>>> import numpy as np
>>> pp = test()
>>> temp = new_floatArray(5)
>>> pp.main(temp)
1
2
3
4
5
6
7
0
0
0
0
0
4.02252e-14
1.4013e-44
False

【问题讨论】:

【参考方案1】:
feat = fv.data();

此行不会改变feat 指向的数据,它会改变feat 的本地版本指向的数据。

所以当你从func2() 返回时,feat 和它指向的数据都不会改变。由于您将未初始化的数据传递给 main,因此您会从 func 1(从它自己的数据)获得 7 次打印,然后是 7 次未初始化数据的打印,这将是什么。

我怀疑你的意思是:

memcpy(feat, fv.data(), fv.size() * sizeof(float));

这会将fv中的数据复制到feat指向的数据中。

【讨论】:

非常感谢!那么指针 float* 指向的地方只停留在本地,不会移出范围? 因为你通过值传递指针。无论如何,fv 中数据的生命周期只延伸到 func1 的末尾。如果您通过引用传递指针并将其更改为指向 fv 的数据。它会变成一个悬空指针,这是非法的。

以上是关于函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)的主要内容,如果未能解决你的问题,请参考以下文章

用 SWIG array_class 包装字节数组数据

swig-php 包装器使用指针,c 代码是一个数组

c复杂函数指针

在 Swig 中通过 ref 返回动态数组

SWIG:无法使用双指针访问构造函数

C语言中怎样用指针找出一维数组中的最大值和最小值并输出它们的下标