Ошибка компилятора при использовании vDSP_normalizeD в проекте SPM - PullRequest
0 голосов
/ 26 января 2019

Как передать нулевой указатель на C API в Swift?

Более конкретно, я пробую следующее:

import Accelerate

let v = [1.0, 2.0]
var m = 0.0
var sd = 0.0
// 3rd arg is of type: UnsafeMutablePointer<Double>?
vDSP_normalizeD(v, 1, nil, 0, &m, &sd, vDSP_Length(v.count))

Документация для vDSP_normalizeD найдена здесь .

Этот способ передачи nil, по-видимому, действителен для более ранних версий Swift, как в этом ответе .Однако при использовании Xcode v10.1 / Swift v4.2.1 выдается следующее сообщение об ошибке:

Nil несовместимо с ожидаемым типом аргумента 'UnsafeMutablePointer'

Следующее решениетоже не работает:

let p: UnsafeMutablePointer<Double>? = nil
vDSP_normalizeD(v, 1, p, 0, &m, &sd, vDSP_Length(v.count))

, выдавая следующее сообщение об ошибке:

Значение необязательного типа 'UnsafeMutablePointer?'должен быть развернут в значение типа «UnsafeMutablePointer»

В более ранних версиях Swift было возможно следующее:

let p = UnsafeMutablePointer<Double>(nil)

, но теперь генерируется следующая ошибка:

Неоднозначное использование 'init'

Итак, мой вопрос - как передать нулевой указатель на C API, используя современную версию Swift?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Проблема решена!

Спасибо OOPer за проверку того, что он действительно скомпилирован, и вопрос: Вы делаете что-то особенное для своего проекта? .

Я поддерживаю свой проект через Swift Package Manager и, по-видимому, при создании проекта XCode он по умолчанию равен MACOSX_DEPLOYMENT_TARGET 10.10. Однако при создании нового проекта напрямую через Xcode v10.1 по умолчанию используется MACOSX_DEPLOYMENT_TARGET 10.12.

Для приведенного выше кода требуется 10.11, и я не понял, что SPM не использовал более позднюю цель развертывания. Теперь все это решается с помощью файла Package.xcconfig с переменной: MACOSX_DEPLOYMENT_TARGET=10.11.

Документация не помогла с самого начала. В справке по vDSP_normalizeD ничего не упоминается о целевых требованиях, вместо этого эта информация содержится в документации для его двоюродного брата vDSP_normalize .

Кстати, это может быть очевидно для некоторых, но мне потребовалось несколько часов, чтобы понять это. Еще раз спасибо ООПер за то, что указали мне немного в правильном направлении.

0 голосов
/ 26 января 2019

это сложно, потому что я не смог проверить это, но я думаю, потому что инициализатор:

попробуйте это:

let p: UnsafeMutablePointer<Double>? = UnsafeMutablePointer<Double>.init(mutating: nil)

И дайте мне знать, если это работает для вас

...