使用cython将double转换为char *

问题描述 投票:-1回答:1

在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

我该如何解决问题?

c char cython
1个回答
2
投票

抛开在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表示的。字符串基本上是你关心的字符列表,后跟一个空终止符\0。我相信有很多资料你可以在网上阅读有关char*char[]之间的区别,我强烈建议你看看它们。我将在这里说,char*只是一个指针,所以它只指向第一个字符。 char*也没有字符串长度的概念。

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

© www.soinside.com 2019 - 2024. All rights reserved.