如何用ctypes将Python浮点嵌套列表转为C double**?遇IndexError报错
Python二维列表转C double**指针(解决IndexError)
错误原因
你之前的代码试图直接创建连续二维c_double数组,但初始化时传入了嵌套元组,不符合该类型的参数要求,导致索引错误。另外,连续二维数组和C语言的double**(指针的指针)不是同一类型,若需要的是double**,得用指针数组的方式构建。
正确实现(转double**)
如果需要对应C的double**类型,需分两步构建:先将每个子列表转为独立的c_double数组,再将这些数组的指针存入指针数组:
import ctypes lst = [[1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0], [3.0, 3.0, 3.0, 3.0]] # 1. 转换每个子列表为c_double数组 row_arrays = [] for sublist in lst: row = (ctypes.c_double * len(sublist))(*sublist) row_arrays.append(row) # 2. 创建指针数组,存储子数组的地址 ptr_array = (ctypes.POINTER(ctypes.c_double) * len(row_arrays))(*row_arrays) # 转为double**类型 c_dbl_ptr = ctypes.cast(ptr_array, ctypes.POINTER(ctypes.POINTER(ctypes.c_double)))
可选:转连续二维数组(对应C的double[M][N])
如果你的C函数接受的是连续内存的二维数组而非double**,可以用扁平化列表初始化:
import ctypes lst = [[1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0], [3.0, 3.0, 3.0, 3.0]] # 扁平化列表 flat_elements = [num for sublist in lst for num in sublist] # 创建连续二维数组 c_contiguous_array = (ctypes.c_double * len(lst) * len(lst[0]))(*flat_elements)
内容的提问来源于stack exchange,提问作者willaayy
相关产品推荐
相关产品推荐

