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