CPointer in Kotlin -Мультиплатформа - PullRequest
1 голос
/ 11 января 2020

Я не могу найти примеры того, как получить 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
           ....

Указанная часть c, которая у меня есть проблемы с

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>?.

Но как?

1 Ответ

1 голос
/ 12 января 2020

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

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)
        ....
}

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

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

Внутри него используйте функцию расширения allo c () , чтобы получить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...