配列の値を変更したいC関数にnumpy配列を渡そうとしています。しかし、正しく動作させるためには、インデックスを2倍しなければなりません。奇数インデックスに値を代入すると(i
とする)、インデックス(i-1)/2
にゴミが割り当てられます。ここにソースコードがあります。numpy配列がC関数によって変更されているときにマジックが起こっています
C:
#include "assign_array.h"
void assign(int *arr, int i) {
arr[i] = 2017;
}
のPython:
import ctypes, numpy
lib2 = ctypes.cdll.LoadLibrary('./assign_array.so')
for i in range(5):
array = numpy.zeros(8, dtype = int)
ptr = array.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
print('i = {}:'.format(i))
lib2.assign(ptr, i)
print(array)
ですが、なぜでしょうか?
これをコンパイルします: 'gcc -shared -o assign_array.so -fPIC assign_array.c' – Dimansel
Linux/Unix-ishシステムを使用していることを示唆していますが、内部の 'int'型に' long 'を使用し、ベースのCコンパイラは64ビットの' long'を持っています。他のCコンパイラも同様です。 – torek
@MatteoItalia:括弧内の更新を参照してください。Python 'int'はC' long'にマップされる可能性が最も高いです。 (それは64ビットの 'int'がまれであることは事実です; Crayはそれらのシステムの1つでした) – torek