使用cython将double转换为char *

时间:2018-04-17 16:26:43

标签: c char cython

在Cython中,如何转换生成C double的C字符串(char *)表示而不使用Python对象(例如bytesstr)作为中间人?

事实上,我已经在C扩展名文件(.pyx)中定义了我的函数,如下所示:

cdef void function(self, char* var1) nogil:

    cdef char* chaine =""
    cdef double inter = 0.0
    #Here there is some treatment which modifies the value of the local variable 'inter' so that it contains a double value different from 0
    strcat(chaine ,  "(")
    strcat(chaine , <char*>inter)
    strcat(chaine ,  ")**beta")

    strcpy(&var1,  chaine)

编译完文件后,我遇到了错误C2440 : impossible de convertir de 'double' en 'char*'C2168 : strcat nombre de paramètres de fonction intrinséque insuffisant

我该如何解决问题?

1 个答案:

答案 0 :(得分:2)

抛开在python或C级别是否值得这样做的问题,看起来你的示例代码中出现了C级的几个关键误解。有很多封面,所以我只是给出一些指示,帮助引导你朝着正确的方向前进;一旦你对C和cython感觉更舒服,可以随意发布你的代码的更正版本作为答案。

首先,关于指针的一个词。指针只是一个保存内存地址的变量。这个记忆地址&#34;点&#34;记忆中的一些内容。这是一个简单的示例,可以清除它:

cdef int a_number = 42#just a regular int, nothing special here :)
cdef int* a_pointer = &a_number#"referencing" to get the address of a_number
cdef int b_number = a_pointer[0]#"dereferencing" to get the value at a_pointer
#note the dereferencing syntax is different in cython than in C!!!

其次是功能如何运作。在C中,所有内容都是按值传递。这意味着无论何时将参数传递给函数,都会生成参数的副本,并在此副本上执行操作。这包括指针;如果您尝试设置var1指针,就像在function中尝试一样,实际的var1指针将保持不变,只有function范围内的本地副本被修改。显然不是我们想要的!

第三,我们需要看看字符串是如何用C表示的。字符串基本上是你关心的字符列表,后跟一个空终止符\0。我相信有很多来源可以在线阅读说char*char[]之间的区别,我强烈建议你看看它们。我将在这里说char*只是一个指针,所以它只指向第一个字符。 char*也没有字符串长度的概念。

一旦掌握了所有这些概念,就可以开始查看linux手册页上的函数,如strcpystrcat。我也会查找sprintf,这类似于python&#39; format,可能比连接一堆更聪明。希望这有助于您的学习之旅,祝您好运!