Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图将numpy数组传递给C++;使用ctypes的共享库_C++_Python 3.x_Numpy_Ctypes - Fatal编程技术网

C++ 试图将numpy数组传递给C++;使用ctypes的共享库

C++ 试图将numpy数组传递给C++;使用ctypes的共享库,c++,python-3.x,numpy,ctypes,C++,Python 3.x,Numpy,Ctypes,我读过几篇关于这方面的帖子,但我仍然不太明白如何让它起作用。 这是我的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),

我读过几篇关于这方面的帖子,但我仍然不太明白如何让它起作用。 这是我的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";
      }
  }

}

我有一种感觉,我对C函数的理解没有我想象的那么多(我是个初学者)。如果你们能指出我错在哪里,那就太好了

你是故意从python中传递一个
float
,但期望在c中传递一个
double
?确保你从python传递的是你在c中所期望的。通常你必须遵循语言定义的规则(堆栈顺序、命名、类型等)。@FrederikJuul这是我提出过的最丢脸的问题。现在工作@MichaelChourdakis这就是用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)