2017-09-13 1 views
2

Ich verstehe nicht, warum Werte von func1 zu func2 und dann main verloren gehen. Es druckt ok in func1, aber fehlgeschlagen in func2 und main. Ich glaube nicht, dass es ein SWIG-Problem ist, mehr fühlt sich an wie ein C++ - Code-Problem ~ Sie können das Problem mit unten Code reproduzieren.verlorener Wert in Array-Zeiger unter den Funktionen (kompiliert mit swig in python3)

mein 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++; 
    } 
} 

mein test.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); 
}; 

mein test.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" 

, wenn ich in python3 testen:

>>> 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 

Antwort

0
feat = fv.data(); 

Diese Zeile ändert nicht die Daten, die feat zeigt, es ändert, welche Daten die lokale Version feat zeigt.

Wenn Sie also von func2() zurückkehren, werden weder feat noch die Daten geändert, auf die es zeigt. Da Sie unitalisierte Daten an main übergeben, erhalten Sie die 7 Drucke von Funktion 1 (von ihren eigenen Daten), gefolgt von 7 Ausdrucken von nicht initialisierten Daten, was auch immer sein wird.

Ich vermute, Sie meinten:

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

die die Daten von fv auf die Daten feat Punkte kopieren wird.

+0

vielen dank! Also, wo der Zeiger float * Punkte nur in lokalen bleibt, bewegt sich nicht außerhalb des Bereichs? – ayy

+0

Weil Sie den Zeiger nach Wert übergeben. In jedem Fall erstreckt sich die Lebensdauer der Daten in fv nur bis zum Ende von func1. Wenn Sie den Zeiger als Referenz übergeben haben und ihn so geändert haben, dass er auf die Daten von fv zeigt. Es würde ein schwebender Zeiger werden, der illegal ist. – Frank

Verwandte Themen