思路:我只会这一招。
1、定义二维矩阵作为参数传入C函数;
2、返回指针后获取内存所指向的内容。
以输入二维矩阵并对其赋值为例示范。
C代码
#include <stdio.h>
int *Print(int *arr,int row,int col){
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
int idx=i*col+j;
arr[idx]=idx;
}
}
return arr;
}
编译
gcc -c Print.c
gcc -shared -o Print.dll Print.o
Python代码
import ctypes as cp
import numpy as np
dll=cp.cdll.LoadLibrary(r'*\Prnit.dll')
def Print(row,col):
func=dll.Print
# 定义输入输出变量
fun.argtypes=[np.ctypeslib.ndpointer(cp.c_int32,2),cp.c_int32,cp.c_int32]
fun.restype=ctypes.POINTER(ctypes.c_int32) # 返回指针类型
#定义输入的二维矩阵,保持类型一致
arr=np.zeros((row,col),dtype=np.int32)
#输入函数
ptr=fun(arr,row,col)
#获取指针指向的内容
arr_type=(cp.int32 * col) * row # 定义cp矩阵
address=cp.addressof(ptr.contents) # 获得指针指向的地址
result=np.frombuffer(arr_type.from_address(address),dtype=np.int32)
#此时结果是一维矩阵,需要将其转换成二维矩阵
result=result.reshape((row,col))
print(result)