调用一个 C 函数,returns 来自 cython 的指针

Call a C function that returns a pointer from cython

我想调用一个 C function,在 header function.h 中从 cython 中声明。函数 return 是一个指向 double 的指针,需要 (double, double *, int) 作为输入。

我在 jupyter-notebook(在 Ubuntu)工作。函数定义在文件 function.c

编译器return出现以下错误:

command 'gcc' failed with exit status 1.

代码如下

    %load_ext cython
    import Cython

    %%cython
    cdef extern from "function.c":
        pass
    cdef extern from "function.h":
        double* function(double, double *, int)

    import numpy as np

    def test(a, B): # B is a one-dim numpy array

        if not B.flags['C_CONTIGUOUS']:
            B = np.ascontiguousarray(B) 
        cdef double[::1] arr_memview = B

        cdef double[::1] x = <double[:arr_memview.shape[0]]>function(a, &arr_memview[0], arr_memview.shape[0])

        return np.asarray(x)

如您所见,我正在使用内存视图。 你能帮我告诉我正确使用的语法是什么吗? 谢谢。

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

function.h

    #include<stdio.h>
    double* function(double a, double *B, int N);

function.c

    #include "function.h"
    double* function(double a, double *B, int N){
      for (int i=0; i<N; ++i)
        printf("%f \n",a);
    return B;
} 

我猜我的代码中的问题是 cython 语法。

在我的例子中,GCC 的实际输出(来自终端 运行 Jupyter)是

fatal error: function.c: No such file or directory
618 | #include "function.c"
    |          ^~~~~~~~~~~~

如果您能按要求复制此内容,将会有所帮助。您需要指定包含路径,以便它可以找到 "function.c"。您可以使用

添加当前目录
%%cython -I.

(尽管这可能取决于您的 Jupyter 基本目录)。


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

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