c++
#pragma once
#include <iostream>
#include <stdio.h>
using namespace std;
extern "C" __declspec(dllexport) int test1(int *a, int array_len);
extern "C" __declspec(dllexport) int test2(int a[2][2]);
extern "C" __declspec(dllexport) int* test3();
int test1(int *a, int len)
{
for (int i = 0; i < len; i++) {
printf("[%d] = %d\n", i, a[i]);
}
return 0;
}
int test2(int a[2][2])
{
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
printf("[%d][%d] = %d\n", i, j, a[i][j]);
}
}
return 0;
}
int* test3()
{
static int array_int[2] = {0};
for (int i = 0; i < 2; i++) {
array_int[i] = i + 1;
}
return array_int;
}
python
需要将上述代码在windows下编译成dll文件,放到py文件同文件夹下即可
from ctypes import *
if __name__ == '__main__':
lib = windll.LoadLibrary('./test.dll')
# 调用C/C++,传参一维int数组
data_1 = (ctypes.c_int * 2)()
data_1[0] = 2
data_1[1] = 3
ret = lib.test1(data_1, 2)
# 调用C/C++,传参二维int数组
data_2 = ((ctypes.c_int*2)*2)()
data_2[0][0] = 2
data_2[0][1] = 3
data_2[1][0] = 4
data_2[1][1] = 5
ret = lib.test2(data_2)
# 返回值是一维数组,这里需要先将返回值进行一下类型转化
lib.test3.restype = POINTER(ctypes.c_int)
data_3 = list(lib.test3()[0:2])