簡體   English   中英

使用 ctypes 傳遞 2d numpy 數組時出現分段錯誤(核心已轉儲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM