1. 程式人生 > >python呼叫C++,傳遞結構體與結構體指標,以及巢狀結構體

python呼叫C++,傳遞結構體與結構體指標,以及巢狀結構體

#include<iostream>

using namespace std;

//該檔名稱:cpptest.cpp

//終端下編譯指令:

//g++ -o cpptest.so -shared -fPIC cpptest.cpp

struct sub_struct{

    char* test_char;

    int test_int;

};

struct struct_def {

    char* stru_string;

    int stru_int;

    char stru_arr_num[4];

    sub_struct son_struct;

};

extern "C"{//在extern “C”中的函式才能被外部呼叫

    int test(struct_def  struct_mystruct,struct_def* struct_test_p) {

        //輸出結構體指標的資料

        cout<<"輸出結構體中的char*字元:";

        cout << struct_mystruct.stru_string << endl;

        cout<<"輸出結構體中的int型:";

        cout << struct_mystruct.stru_int <<endl;

        cout <<"輸出結構體中的字元陣列:";

        for(int x = 0;x< 4;x++){cout << struct_mystruct.stru_arr_num[x]<<"   ";}

        cout<< endl;

        cout<<"輸出子結構體中的char*型:";

        cout << struct_mystruct.son_struct.test_char<<endl;

        cout<<"輸出子結構體中的int型:";

        cout<<struct_mystruct.son_struct.test_int<<endl;

        //輸出結構體指標的資料

        cout<<endl;

        cout<<endl;

         cout<<"輸出結構體指標中的char*字元:";

        cout << struct_test_p->stru_string << endl;

        cout<<"輸出結構體指標中的int型:";

        cout << struct_test_p->stru_int <<endl;

        cout <<"輸出結構體指標中的字元陣列:";

        for(int x = 0;x< 4;x++){cout << struct_test_p->stru_arr_num[x]<<"   ";}

        cout<< endl;

        cout<<"輸出子結構體指標中的字串:";

        cout<<struct_test_p->son_struct.test_char;

        cout << endl;

        cout<<"輸出子結構體指標中的int型:";

        cout<<struct_test_p->son_struct.test_int<<endl;

    }

}

##python 檔案

##檔名  pytest.py

import ctypes

mylib = ctypes.cdll.LoadLibrary("cpptest.so")

class sub_struct(ctypes.Structure):

    _fields_ = [

        ("test_char_p",ctypes.c_char_p),

        ("test_int",ctypes.c_int)

    ]

class struct_def(ctypes.Structure):

    _fields_ = [

        ("stru_string",ctypes.c_char_p),

        ("stru_int", ctypes.c_int),

        ("stru_arr_num", ctypes.c_char*4),

        ("son_struct", sub_struct)

    ]

struct_mystruct = struct_def()

struct_mystruct.stru_string = b"string in the struct"

struct_mystruct.stru_int = 99

struct_mystruct.stru_arr_num = b"ABCD"

struct_mystruct.son_struct.test_char_p =b"sub struct of the string"

struct_mystruct.son_struct.test_int = 10

mylib.test(struct_mystruct,ctypes.byref(struct_mystruct))