Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Native cinterop从C更新Struc字段_Kotlin_Kotlin Native - Fatal编程技术网

Kotlin Native cinterop从C更新Struc字段

Kotlin Native cinterop从C更新Struc字段,kotlin,kotlin-native,Kotlin,Kotlin Native,我使用的是kotlin native,必须将指向struc的指针传递给C函数。我的“Kotlin存根”具有fun SET\u SM\u REFS\u INDEX(INDEX:Int,thisObject:CValuesRef?)的签名 在本机端,代码希望保留指向“thisObject”的指针,并希望更新结构中的字段(可能在另一个线程中)。例如,让我们将该字段称为整数“thisObject->myUpdate” 现在,我尝试使用var AA=cValue创建一个对象,并尝试按如下方式调用函数 设置

我使用的是kotlin native,必须将指向struc的指针传递给C函数。我的“Kotlin存根”具有fun SET\u SM\u REFS\u INDEX(INDEX:Int,thisObject:CValuesRef?)的签名

在本机端,代码希望保留指向“thisObject”的指针,并希望更新结构中的字段(可能在另一个线程中)。例如,让我们将该字段称为整数“thisObject->myUpdate”

现在,我尝试使用var AA=cValue创建一个对象,并尝试按如下方式调用函数 设置索引(0,AA)。没有编译错误。但是我注意到我的字段“AA.update”从未更新,始终保持在0

在阅读文档时,它说了一些关于可能使用kotlinx.cinterop.NativePlacement的内容,但没有详细说明

我可以看出,cValue可能是错误的传递对象,因为它具有byValue语义


有人知道怎么做吗?

好的,我想我找到了答案。例如:

而不是

var AA=cValue

需要

var AA=nativeHeap.alloc()

其中“.”是Klib存根中的C结构类型

设置索引(0,AA.ptr)

请注意“.ptr”,并记住在该行的某个位置显式释放内存

nativeHeap.free(AA)

我必须使用nativeHeap,因为我在一个保持不变的作用域中使用C结构,有点“全球化”。还有另一种方法可以在memScope{}中更“本地”地使用alloc,而在memScope中,您不需要明确地释放内存

希望这对别人有帮助