cython结构,从python到cython的字符串

2024-09-25 08:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按照下面的方法将python对象转换为cython结构,但是它没有将simres[1]的值赋给resulta[x].cpt1

cdef struct resultaStructure:
    double score
    char **cpt1

simRes = [1.0,
['http://bioontology.org/projects/ontologies/fma/fmaOwlDlComponent_2_0#Abdomen', 
'Abdomen']]
cdef x = 0 
cdef resultaStructure *resulta = <resultaStructure *> malloc(sizeof(resultaStructure)*labelsSourceTaille)

resulta[x].score = simRes[0]
print("score : ",resulta[0].score)

resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)
print('2')
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
print('3')
resulta[x].cpt1[1] = <char*> malloc (sizeof (char)*simRes[1][1].__len__()+1)
print('4')
resulta[x].cpt1[0] = <char*> simRes[1][0]
print('5')
resulta[x].cpt1[1] = <char*>  simRes[1][1]
print('6')

print("cpt1 0 : ",resulta[0].cpt1[0])
print("cpt1 1 : ",resulta[0].cpt1[1])

这是结果

('score :', 1.0)

2

3

4


Tags: 对象方法lencythonscoreprintcharcdef
2条回答

问题中的代码和OP的答案中的代码存在严重的问题,这些问题可能会导致程序在长期内崩溃。在

(一)

resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)

cpt1是指向(一组)字符指针的指针。因此,应将其指定为

^{pr2}$

(更好的是,如果长度总是2,那么在结构定义中分配char *cpt1[2],而不需要malloc它。)

这不太可能引起真正的问题,因为所有指针的大小都相同,但仍然是错误的。在

2) (真正的问题a部分)

resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
# ...
resulta[x].cpt1[0] = <char*>some_python_string

在这里,您分配了一些内存,如果您愿意让指针指向Python字符串所拥有的不同内存区域,则会立即忘记已分配的内存。您不需要做的是将Python字符串中的数据复制到分配的内存中。在

3) (真正的问题b部分)

str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1

cpt1[0]指向的内存归str1所有。{6}如果你的cd6结构已经被释放了,那么稍后你的程序就会释放一些无效的数据。在

如果您可以保证str1将比您的结构寿命长(例如,您的结构被用作一个C函数调用的参数),那么这是可以的,但在一般情况下,它可能不是

解决方案是将内容或str1复制到新分配的内存中:

resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*len(simRes[1][0])+1)
strcpy(resulta[x].cpt1[0],str1)

(另外,你还记得要free你所有的记忆,对吗?)在

解决方案是在赋值之前对python字符串进行编码,如下所示

str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1
print('5')
str2 = simRes[1][1].encode('UTF-8')
resulta[x].cpt1[1] = <char*> str2

相关问题 更多 >