pythonでc言語で作成したsoファイルの呼び出しを行いたいのですが以下のようなエラーが出ます。解決方法を教えていただきたいです。お願いします。
OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
参考にしたサイトのURLはこちらです。
https://qiita.com/motacapla/items/01de7d59cacb3f96caaf
cのコード 引数の行列の全要素にnを足すもの
#include <stdio.h> void add_matrix(double **matrix, int row, int col, int n) { int i, j; for(i=0; i<row; i++){ for(j=0; j<col; j++){ matrix[i][j] = matrix[i][j] + n; } } }
コンパイル方法
gcc -cpp -fPIC -shared libadd.c -lm -o libadd.so -O3
pythonコード
from ctypes import * import ctypes.util from numpy.ctypeslib import ndpointer import numpy as np from numpy.random import * #さっきつくったlibadd.soファイルを指定 lib = np.ctypeslib.load_library("libadd.so",".") #適当につくります row = 20 col = 5 n = 5 matrix = rand(row, col) #doubleのポインタのポインタ型を用意 _DOUBLE_PP = ndpointer(dtype=np.uintp, ndim=1, flags='C') #add_matrix()関数の引数の型を指定(ctypes) lib.add_matrix.argtypes = [_DOUBLE_PP, c_int32, c_int32, c_int32] #add_matrix()関数が返す値の型を指定(今回は返り値なし) lib.add_matrix.restype = None #おまじない tp = np.uintp mpp = (matrix.__array_interface__['data'][0] + np.arange(matrix.shape[0])*matrix.strides[0]).astype(tp) #int型もctypeのc_int型へ変換して渡す n = ctypes.c_int(n) row = ctypes.c_int(row) col = ctypes.c_int(col) print("before:", matrix) lib.add_matrix(mpp, row, col, n) print("after:", matrix)
回答2件
あなたの回答
tips
プレビュー