Преобразование непрерывного массива в UnsafePointer невозможно - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь вызвать функции cblas из определенного пользователем типа Matrix, который использует массив для хранения элементов матрицы. Здесь очень упрощенная форма кода:

struct BoxArr{
    var y: Array<Double>
    init( y: Array<Double> ){
        self.y = y
    }
}

var A = BoxArr( y: [1.0, 2.0, 3.0] )
let s = cblas_dasum( Int32(A.y.count), A.y, 1 )
print(s)

Приведенный выше код работает без проблем, получая правильную сумму 6.0. Обратите внимание, что функция cblas_dasum получает три аргумента: (1) количество элементов в массиве, (2) указатель на массив, содержащий числа, и (3) шаг. У меня проблема с преобразованием типов со вторым аргументом. Если я изменил тип члена структуры y с Array на ContiguousArray, как я это сделал в следующем:

struct BoxContArr{
    var y: ContiguousArray<Double>
    init( y: ContiguousArray<Double> ){
        self.y = y
    }
}

var A = BoxContArr( y: [1.0, 2.0, 3.0] )
let s = cblas_dasum( Int32(A.y.count), A.y, 1 )
print(s)

, я получу следующую ошибку:

Cannot convert value of type 'ContiguousArray<Double>' to expected argument type 'UnsafePointer<Double>?'

В первом случае второй аргумент A.y типа Array<Double> был неявно преобразован в UnsafePointer<Double>, но во втором случае ContiguousArray<Double> не был преобразован в UnsafePointer<Double>. Интересно, почему это происходит и как это исправить. Я предпочитаю использовать ContiguousArray для возможно лучшей производительности. Я сделал мелкие копии массивов в конструкторе, но это не меняет результат (в расширенной реализации сделана глубокая копия.)

1 Ответ

0 голосов
/ 04 марта 2020

Указатель должен быть на первый элемент буфера:

    var A = BoxContArr( y: [1.0, 2.0, 3.0] )
    A.y.withUnsafeBufferPointer { ptr in
        let s = cblas_dasum( Int32(A.y.count), ptr.baseAddress, 1 )
        print(s) // 6.0
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...