【问题标题】:Convert a double to char* with cython使用 cython 将 double 转换为 char*
【发布时间】:2018-04-17 16:26:42
【问题描述】:

在 Cython 中,如何在不使用 Python 对象(例如 bytesstr)作为中间体的情况下转换生成 C 双精度的 C 字符串 (char *) 表示形式?

事实上,我已经在一个 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的错误

请问我该如何解决这个问题?

【问题讨论】:

  • 请阅读How to Askhelp center,尝试提供minimal reproducible example 并解释为什么您的代码不起作用。如果您没有代码,则几乎没有机会从该站点获得帮助。
  • 您的代码有未定义的行为。您需要避免在 c 中这样做,或者准确了解什么是 c 字符串以及它们是如何工作的。
  • 我尽量简化函数的定义,因为在实际代码中比较复杂,里面有很多处理。
  • 没关系。由于缺乏关于 c 字符串和内存管理的知识,代码存在一个根本错误。
  • 对不起,我真的是 cython 代码的初学者:/

标签: c char cython


【解决方案1】:

撇开在 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,并且可能比将一堆片段连接在一起更聪明。希望这对您的学习之旅有所帮助,祝您好运!

【讨论】:

  • 是的,这让我走上了正轨。谢谢
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2017-12-21
相关资源
最近更新 更多