[英]Segmentation fault (core dumped) when a 2d numpy array is passed using ctypes
我想使用 ctypes 將 2d numpy 數組傳遞給用 C 編寫的 function。 當我嘗試訪問 C function 中的數據時,我得到: Segmentation fault (core dumped)
。 代碼是:
代碼在 C
#include <stdio.h>
void np_array_complex_shape(double ** data, int * shape){
printf("%d\n", shape[0]);
printf("%d\n", shape[1]); // These print ok.
printf("%f", data[0][0]); // This one throws: Segmentation fault (core dumped)
}
python 中的代碼:
import os
import ctypes
import numpy as np
import numpy.ctypeslib as npct
test_library_file_location = "library.so"
array_2d_double = npct.ndpointer(dtype=np.double, ndim=2, flags='CONTIGUOUS')
array_1d_int = npct.ndpointer(dtype=np.int32, ndim=1, flags='CONTIGUOUS')
LIBC = ctypes.CDLL(test_library_file_location)
LIBC.np_array_complex_shape.restype = None
LIBC.np_array_complex_shape.argtypes = [array_2d_double, array_1d_int]
x = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.float64)
s = np.array(x.shape, dtype=np.int32)
c = LIBC.np_array_complex_shape(x, s)
我嘗試了在網上找到的不同解決方案,但沒有用。 有人可以幫我嗎?
我正在使用 linux 和 gcc 編譯器。
雖然您通常可以在某種程度上將 arrays 與指針混合使用,但將 2D arrays 與指向指針的指針混合使用永遠不會正確。 如果你知道第二個維度永遠是 3,那么你可以在你的 C 代碼中將double ** data
更改為double (*data)[3]
,然后一切正常。 如果它並不總是一個常數,但 Python 將始終知道它是什么並且您可以使用 VLA,那么您可以將 function 重新聲明為void np_array_complex_shape(int cols, double (*data)[cols], int *shape)
並為cols
傳遞適當的值。 否則,您需要將其更改為double *data
,然后手動計算索引,就像將其展平為一維數組一樣(在您的簡單示例中,這只是將data[0][0]
更改為data[0]
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.