2016-11-20 2 views
1

из функций Vector-Scalar Линейная алгебра (от vectorOps.h) https://developer.apple.com/reference/accelerate/1546030-visamaxКак вызвать функцию DSP с помощью OpaquePointer?

Func vIsamax (_ графа: Int32, _ х: OpaquePointer) -> Int32)

счета Количество элементов в векторе x; должен быть кратным 4.

x Векторный массив значений поплавка.

я пробовал решения от https://swift.org/migration-guide/se-0107-migrate.html UnsafeRawPointer, withUnsafePointer, MemoryLayout и т.д. как еще не имели успеха

не может ссылаться на инициализатор для типа '' OpaquePointer с ... CFData,

может не вызывать "" с ... yada, yada, yada

Как вызвать функцию DSP с OpaquePointer?

+0

Показать ваш код. – Alexander

+0

Я просмотрел 15 различных вариантов с страницы миграции. –

+1

Обратите внимание, что вам действительно не следует использовать 'vIsamax', который существует только для устаревшей поддержки. Вместо этого вы должны использовать 'cblas_isamax' или' vDSP_maxmgvi' (они быстрее и доступны также на новых платформах, таких как iOS, но 'vIsamax' - только OS X - у них также есть более точная документация, так как они активно развиваются). –

ответ

1

vIsamax принимает вектор vFloat aka float4 элементы в качестве аргумента. (Каждый float4 имеет 4 числа с плавающей точкой.) Декларация С

int32_t vIsamax(int32_t count, const vFloat *x); 

который должен быть сопоставлен Swift в

public func vIsamax(_ count: Int32, _ x: UnsafePointer<vFloat>) -> Int32 

вместо

public func vIsamax(_ count: Int32, _ x: OpaquePointer) -> Int32 

Но вы может просто передать массив vFloat/float4, как показано в is малый пример:

import Swift 
import Accelerate 
import simd 

let values = [ float4(-1.0, -2.0, -3.0, -4.0), float4(4.0, 3.0, 2.0, 1.0) ] 
let idx = vIsamax(Int32(4 * values.count), values) 
print(idx) // 3 
+0

ах, большое спасибо, поэтому документация неверна. –

Смежные вопросы