如何在没有循环的情况下在 Cython 中创建空的 char 数组
How to create empty char arrays in Cython without loops
嗯,这看起来很简单,但我在网上找不到任何参考资料。在 C 中,我们可以创建一个 char
数组 n
空字符,如下所示:
char arr[n] = "";
但是当我尝试在 Cython 中使用
做同样的事情时
cdef char arr[n] = ""
我得到这个编译错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef char a[n] = ""
^
------------------------------------------------------------
Syntax error in C variable declaration
显然 Cython 不允许以这种方式声明数组,但是有替代方法吗?我不想手动设置数组中的每个项目,也就是说我不是在寻找这样的东西
cdef char a[10]
for i in range(0, 10, 1):
a[i] = b"[=13=]"
怎么样:
cdef char *arr = ['[=10=]']*n
在 C 中,'' 用于字符,"" 用于字符串。但是任何 'empty char' 并没有真正意义,可能你想要的是 '\0' 或者只是 0
也许:
import cython
from libc.stdlib cimport malloc, free
cdef char * test():
n = 10
cdef char *arr = <char *>malloc(n * sizeof(char))
for n in range(n):
arr[n] = '[=10=]'
return arr
编辑
void *
calloc(size_t count, size_t size);
为你做的,
您不必设置每个元素来生成长度为零的 C 字符串。只需将第一个元素置零就足够了:
cdef char arr[n]
arr[0] = 0
接下来,如果要将整个 char 数组归零,请使用 memset
from libc.string cimport memset
cdef char arr[n]
memset(arr, 0, n)
如果 C 纯粹主义者抱怨 0 而不是 '\0',请注意 '\0' 在 Cython 中是一个 Python 字符串(Python 3 中的 unicode)。 '\0' 不是 Cython 中的 C 字符! memset 的第二个参数需要一个整数值,而不是 Python 字符串。
如果你真的想知道 Cython 中 C '\0' 的 int 值,你必须在 C:
中编写一个辅助函数
/* zerochar.h */
static int zerochar()
{
return '[=12=]';
}
现在:
cdef extern from "zerochar.h":
int zerochar()
cdef char arr[n]
arr[0] = zerochar()
或
cdef extern from "zerochar.h":
int zerochar()
from libc.string cimport memset
cdef char arr[n]
memset(arr, zerochar(), n)
嗯,这看起来很简单,但我在网上找不到任何参考资料。在 C 中,我们可以创建一个 char
数组 n
空字符,如下所示:
char arr[n] = "";
但是当我尝试在 Cython 中使用
做同样的事情时cdef char arr[n] = ""
我得到这个编译错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef char a[n] = ""
^
------------------------------------------------------------
Syntax error in C variable declaration
显然 Cython 不允许以这种方式声明数组,但是有替代方法吗?我不想手动设置数组中的每个项目,也就是说我不是在寻找这样的东西
cdef char a[10]
for i in range(0, 10, 1):
a[i] = b"[=13=]"
怎么样:
cdef char *arr = ['[=10=]']*n
在 C 中,'' 用于字符,"" 用于字符串。但是任何 'empty char' 并没有真正意义,可能你想要的是 '\0' 或者只是 0
也许:
import cython
from libc.stdlib cimport malloc, free
cdef char * test():
n = 10
cdef char *arr = <char *>malloc(n * sizeof(char))
for n in range(n):
arr[n] = '[=10=]'
return arr
编辑
void *
calloc(size_t count, size_t size);
为你做的,
您不必设置每个元素来生成长度为零的 C 字符串。只需将第一个元素置零就足够了:
cdef char arr[n]
arr[0] = 0
接下来,如果要将整个 char 数组归零,请使用 memset
from libc.string cimport memset
cdef char arr[n]
memset(arr, 0, n)
如果 C 纯粹主义者抱怨 0 而不是 '\0',请注意 '\0' 在 Cython 中是一个 Python 字符串(Python 3 中的 unicode)。 '\0' 不是 Cython 中的 C 字符! memset 的第二个参数需要一个整数值,而不是 Python 字符串。
如果你真的想知道 Cython 中 C '\0' 的 int 值,你必须在 C:
中编写一个辅助函数/* zerochar.h */
static int zerochar()
{
return '[=12=]';
}
现在:
cdef extern from "zerochar.h":
int zerochar()
cdef char arr[n]
arr[0] = zerochar()
或
cdef extern from "zerochar.h":
int zerochar()
from libc.string cimport memset
cdef char arr[n]
memset(arr, zerochar(), n)