CPointer в Котлин-Мультиплатформе

Я не могу найти никаких примеров того, как получить CPointer в Kotlin Multiplatform, и существующая документация не очень помогает. В моем исходном наборе iOS мне нужно создать Kotlin-эквивалент следующего кода Swift (включая только соответствующие части кода):

  ...(hex: String) {

if hex.hasPrefix("#") {
    let start = hex.index(hex.startIndex, offsetBy: 1)
         let scanner = Scanner(string: hexColor)
         var hexNumber: UInt64 = 0



          if scanner.scanHexInt64(&hexNumber) {

            r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
           ....

Конкретная часть, с которой у меня проблемы, это

scanner.scanHexInt64 (& hexNumber)

Это код Kotlin и вопрос

//input to function - hex: String
    val scanner = NSScanner(hex)
    if (hex.startsWith("#")) {
        scanner.scanLocation = 1u
    }
    var hexNumber : UInt32 = 0u
    /*Type mismatch.
    Required:
    CPointer<UIntVar /* = UIntVarOf<UInt> */>?
    Found:
    UInt32 /* = UInt */
     */
    //HOW TO GET CPOINTER TO hexNumber?
    scanner.scanHexInt(hexNumber)

Согласно документации: (ссылка)

Указатели и массивы отображаются в CPointer<T>?.

Но как?


person Dmitri    schedule 11.01.2020    source источник


Ответы (2)


Нашел ответ на свой вопрос. Придется использовать

memScoped

.

memScoped {
        var pointed : UIntVar = alloc<UIntVar>()
        scanner.scanHexInt(pointed.ptr)
        val alpha: CGFloat = 1.0
        val pointedValue = pointed.value
        val r: CGFloat = (((pointedValue and 0xFF0000) shr 16)/255.0)
        ....
}

Единственный источник в Интернете по этому поводу (в отношении применения его для получения указателя) здесь - ссылка

memScoped

inline fun <R> memScoped(block: MemScope.() -> R): R
Runs given block providing allocation of memory which will be automatically disposed at the end of this scope

В нем используйте функцию расширения alloc (), чтобы получить CVariable

fun <reified T : CVariable> NativePlacement.alloc(): T

Что затем дает вам доступ к указателю через еще одну функцию расширения

val <T : CPointed> T.ptr: CPointer<T>

Все очень ясно в ретроспективе и ясно, что изначально подходил к проблеме неправильно, пытаясь получить указатель с помощью чего-то вроде CPointer<UInt> = ... Официальная документация на https://kotlinlang.org/docs/reference/native/c_interop.html.

person Dmitri    schedule 12.01.2020
comment
Возможно, стоит добавить ссылку kotlinlang.org/docs/reference/native/c_interop.html к вашему ответу, так как там есть несколько примеров. - person treesAreEverywhere; 24.01.2020

person    schedule
comment
пожалуйста, добавьте пояснение к своему ответу - person DanielM; 02.07.2020