Я прочитал несколько разных постов по этому поводу, но я до сих пор не совсем понял, как заставить это работать. Вот моя python сторона:
import ctypes
from numpy.ctypeslib import ndpointer
import numpy as np
lib = ctypes.cdll.LoadLibrary("./build/libskel.so")
fun = lib.cfun
fun.restype = None
fun.argtypes = [ndpointer(ctypes.c_float),
ctypes.c_size_t,
ndpointer(ctypes.c_float)]
indata = np.ones((5,6), dtype=np.float32)
outdata = np.empty((5,6), dtype=np.float32)
fun(indata, indata.size, outdata)
print(outdata)
А вот моя функция c ++:
extern "C" {
void cfun(const double *indatav, size_t size, double *outdatav)
{
std::cout << "Size: " << size << "\n";
size_t i;
for (i = 0; i < size; ++i)
{
// std::cout << "indatav[i]: " << i << "\n";
outdatav[i] = indatav[i] * 2.0;
std::cout << "indatav[i]: " << indatav[i] << ", outdatav[i]: " << outdatav[i] << "\n";
}
}
}
Теперь вывод этого python кода при запуске выглядит следующим образом:
Size: 30
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 0.0078125, outdatav[i]: 0.015625
indatav[i]: 3.16696e-321, outdatav[i]: 6.33392e-321
indatav[i]: 4.94066e-324, outdatav[i]: 9.88131e-324
indatav[i]: 5.07566e-317, outdatav[i]: 1.01513e-316
indatav[i]: 2.92487e-321, outdatav[i]: 5.84974e-321
indatav[i]: -nan, outdatav[i]: -nan
indatav[i]: 6.32394e-191, outdatav[i]: 1.26479e-190
indatav[i]: 4.96982e-297, outdatav[i]: 9.93965e-297
indatav[i]: 2.58227e-306, outdatav[i]: 5.16455e-306
indatav[i]: 7.26551e-292, outdatav[i]: 1.4531e-291
indatav[i]: 3.38518e-306, outdatav[i]: 6.77036e-306
indatav[i]: 2.15385e-282, outdatav[i]: 4.30769e-282
indatav[i]: 1.41034e-277, outdatav[i]: 2.82067e-277
indatav[i]: 4.59739e-287, outdatav[i]: 9.19478e-287
indatav[i]: 3.01588e-282, outdatav[i]: 6.03175e-282
indatav[i]: 7.02093e-292, outdatav[i]: 1.40419e-291
[[1. 1.125 1. 1.125 1. 1.125]
[1. 1.125 1. 1.125 1. 1.125]
[1. 1.125 1. 1.125 1. 1.125]
[1. 1.125 1. 1.125 1. 1.125]
[1. 1.125 1. 1.125 1. 1.125]]
Segmentation fault (core dumped)
У меня такое чувство, что я не понимаю свою функцию C так, как я думал (я новичок). Если бы вы, ребята, могли указать, где я ошибся, это было бы здорово!