2017-12-15 17 views
-1

私は私のC++プログラムにいくつかのPythonコードを埋め込むとPythonモジュールをインポートし、それへのポインタを取得しようとしていた、私はここで2つのオプションがあります引数:ポインタパラメータ

void importPyModule(PyObject * modPtr, const char *modName){ 
    modPtr = PyImport_ImportModule(modName); 

    if(modPtr == nullptr){ 
     std::cout << "python module: " << modName << " import failed\npython message: "; 
     PyErr_Print(); 
     std::exit(1); 
    } 
} 

またはポインタを返す:私は私の関数を呼び出していますどこ完全性については

PyObject *importPyModule(const char *modName){ 
    PyObject *modPtr = PyImport_ImportModule(modName); 

    if(modPtr == nullptr){ 
     std::cout << "python module: " << modName << " import failed\npython message: "; 
     PyErr_Print(); 
     std::exit(1); 
    } 
} 

を、これは次のようになります。

#include "Python.h" 
#include <stdint.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <iomanip> 

int main(){ 

    initPython(); // initialize the interpreter and set appropriate paths 
    PyObject *aws_tools, *boto, *imp, *sdb; 

    // Option 1: return pointer 
    aws_tools = importPyModule("aws_tools"); 
    // Or option 2: pass a pointer 
    importPyModule(aws_tools, "aws_tools"); 

    /* Some other code */ 

    return 0; 
} 

私は、引数としてポインタを渡すと、私はを指すポインタを取得:

しかし、私のポインタ関数の戻り値、私が手:

<module at [some address]> 

unknownへのポインタがプログラムをクラッシュする間、モジュールへのポインタは正しく動作します。

私の質問は次のとおりです。この仕事をしているのより良い方法があり、ここで動作の違いを引き起こしている何

(ポインタを使うよりは?)?

私は、呼び出し元の関数の値が変更されませんので、それはローカル変数のパラメータ・例では、C++ 11で++標準とのpython2.6

+1

オプション1では、ポインタを参照渡しする必要があります。それ以外の場合は、指定されたポインタに影響を与えないコピーに割り当てます。 –

+0

ああ、私は馬鹿だと感じる – Dino

答えて

0

をグラムを使用しています。

パラメータの例をポインタへのポインタにし、それに応じて残りの部分を修正すると、呼び出し元の関数の値が変更され、正常に機能します。

関連する問題