调用从cython返回指针的C函数

调用从cython返回指针的C函数,cython,cythonize,Cython,Cythonize,我想调用一个C函数,它在cython的function.h头中声明。该函数返回指向double的指针,并需要(double,double*,int)作为输入 我在jupyter笔记本上工作(在Ubuntu上)。函数定义位于文件function.c 编译器返回以下错误: command 'gcc' failed with exit status 1. 代码如下 %load\u ext cython 进口赛昂 %%赛昂 “function.c”中的cdef外部: 通过 “function.h”中的

我想调用一个C
函数
,它在cython的
function.h
头中声明。该函数返回指向double的指针,并需要(double,double*,int)作为输入

我在jupyter笔记本上工作(在Ubuntu上)。函数定义位于文件
function.c

编译器返回以下错误:

command 'gcc' failed with exit status 1.
代码如下

%load\u ext cython
进口赛昂
%%赛昂
“function.c”中的cdef外部:
通过
“function.h”中的cdef外部:
double*函数(double,double*,int)
将numpy作为np导入
def测试(a,B):#B是一个一维numpy阵列
如果不是B.flags['C_continuous']:
B=np.ASCONTIGOUUSARRAY(B)
cdef double[::1]arr_memview=B
cdef double[::1]x=函数(a,&arr\u memview[0],arr\u memview.shape[0])
返回np.asarray(x)
如您所见,我正在使用memview。 你能帮我告诉我什么是正确的税吗? 多谢各位

编辑
double*函数(double,double*,int)
可以是具有这些参数和返回类型的任何通用函数。这是我使用的c代码:

函数.h

#包括
双*函数(双a、双B、整数N);
功能c

#包括“function.h”
双*函数(双a、双B、整数N){

对于(int i=0;i,在我的例子中,GCC(从运行Jupyter的终端)的实际输出是

如果您已按要求复制此文件,则会有所帮助。您需要指定包含路径,以便它可以找到“function.c”。您可以使用

%%cython -I.
(尽管这可能取决于您的Jupyter基本目录)


您的代码可能存在一系列其他问题。您应该查找C include guards(它们的缺失在这里不会给您带来问题,但在其他情况下可能会造成问题)


您应该认真考虑内存管理以及谁拥有返回的指针。它需要保持一致。目前它属于
B
,但这不可能总是正确的。

gcc错误会记录到启动Jupiter的终端。它会告诉您问题出在哪里-可能是在function.h/c which w中e不看-请看。@ead我添加了function.h/c。gcc消息很难理解,但现在它的输出可以被任何人复制。我想问题是我不熟悉sintax。谢谢。你肯定会有一个潜在的灾难,因为没有包含保护。还有内存管理(谁拥有您返回的指针…在本例中没有人,但这始终是真的)。但正如ead所说,您应该尝试查找实际的gcc错误消息,因为这将是信息量。@DavidW您是对的。但目前我只想了解如何将numpy数组传递给C函数,并将输出转换为另一个numpy数组。我将.ipynb文件放在function.h/C的同一目录中。我不知道ee那个gcc输出。我按照你的建议做了,但没有做任何更改。gcc输出显示在你运行jupyter的终端上,而不是在jupyterOk中。谢谢。我想问题是如何给编译器正确的指令。现在我正在研究如何用setup.py文件编译它。但是我更喜欢只使用jupyter notebook。你可以尝试用以下文件替换目录的完整路径:
%%cython-I/home/username/full/path
。除此之外,我不知道该建议什么-它对甲烷非常有效。之前我在尝试遵循你的指示时犯了一个愚蠢的错误。现在我再次尝试,它有效。你的解决方案非常有效。Tnx aga在里面
%%cython -I.