我想将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])
这是结果
(&#39;得分:&#39;,1.0)
2
3
4
答案 0 :(得分:1)
解决方案是在分配之前对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
答案 1 :(得分:1)
问题和OP的答案中的代码存在严重问题,可能会导致程序长期崩溃。
resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)
cpt1
是指向(数组)char指针的指针。因此它应该被指定为
resulta[x].cpt1 = <char*> malloc (sizeof (char*)*2)
(更好的是,如果长度始终为2
,则在结构定义中指定char *cpt1[2]
,而您不需要malloc
。)
这不太可能导致真正的问题,因为所有指针的大小都相同,但它仍然是错误的。
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
# ...
resulta[x].cpt1[0] = <char*>some_python_string
在这里你分配一些内存,如果有利于使指针指向Python字符串所拥有的不同内存区域,则会立即忘记你已经分配的内存。您 所做的是将Python字符串中的数据复制到已分配的内存中。
str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1
cpt1[0]
指向的内存归str1
所有。如果str1
在您使用完结构之前被释放,那么结构将指向无效的内存,您的程序将崩溃,或者读取稍后分配的随机数据或其他一些坏事。
如果你可以保证str1
将比你的结构更长(例如,你的结构被用作一个C函数调用的参数)那么这是可以的,但在一般情况下它可能不是&#39;吨。
解决方案是将内容或str1
复制到新分配的内存中:
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*len(simRes[1][0])+1)
strcpy(resulta[x].cpt1[0],str1)
(另外,您还记得free
malloc
所有的记忆,对吗?)