调用一个 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
所有,但这不太可能总是正确的。
我想调用一个 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
所有,但这不太可能总是正确的。