使用cython将double转换为char *
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cython将double转换为char *相关的知识,希望对你有一定的参考价值。
在Cython中,如何在不使用Python对象(例如char *
或bytes
)作为中间体的情况下转换生成C double的C字符串(str
)表示?
实际上,我已经在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
我该如何解决问题?
答案
抛开在python或C级别上是否值得这样做的问题,看起来你的示例代码中存在C级的几个关键误解。有很多封面,所以我只是给出一些指示,帮助引导你朝着正确的方向前进;一旦你对C和cython感觉更舒服,可以随意发布你的代码的更正版本作为答案。
首先,关于指针的一个词。指针只是一个保存内存地址的变量。该存储器地址“指向”存储器中的某些内容。这是一个简单的示例,可以清除它:
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表示的。字符串基本上是你关心的字符列表,后跟一个空终止符