Как можно передавать или копировать данные в массиве C, например
float foo[1024];
между функциями C и Swift, которые используют массивы фиксированного размера, такие как объявленные
let foo = Float[](count: 1024, repeatedValue: 0.0)
?
Как можно передавать или копировать данные в массиве C, например
float foo[1024];
между функциями C и Swift, которые используют массивы фиксированного размера, такие как объявленные
let foo = Float[](count: 1024, repeatedValue: 0.0)
?
Я не думаю, что это легко возможно. Точно так же, как вы не можете использовать массивы стилей C для параметров, работающих с NSArray
.
Все массивы C в Swift представлены UnsafePointer
, например. UnsafePointer<Float>
. Swift действительно не знает, что данные представляют собой массив. Если вы хотите преобразовать их в массив Swift, вы создадите новый объект и скопируете его там один за другим.
let array: Array<Float> = [10.0, 50.0, 40.0]
// I am not sure if alloc(array.count) or alloc(array.count * sizeof(Float))
var cArray: UnsafePointer<Float> = UnsafePointer<Float>.alloc(array.count)
cArray.initializeFrom(array)
cArray.dealloc(array.count)
Изменить
Только что нашел лучшее решение, это может фактически избежать копирования.
let array: Array<Float> = [10.0, 50.0, 40.0]
// .withUnsafePointerToElements in Swift 2.x
array.withUnsafeBufferPointer() { (cArray: UnsafePointer<Float>) -> () in
// do something with the C array
}
Метод withUnsafePointerToElements()
был удален, теперь вы можете использовать withUnsafeBufferPointer()
вместо этого и использовать метод baseAddress
в блоке для достижения точки
let array: Array<Float> = [10.0, 50.0, 40.0]
array.withUnsafeBufferPointer { (cArray: UnsafePointer<Float>) -> () in
cArray.baseAddress
}
С Beta 5 можно просто использовать pass & array Следующий пример передает 2 массива с плавающей запятой функции vDSP C:
let logLen = 10
let len = Int(pow(2.0, Double(logLen)))
let setup : COpaquePointer = vDSP_create_fftsetup(vDSP_Length(logLen), FFTRadix(kFFTRadix2))
var myRealArray = [Float](count: len, repeatedValue: 0.0)
var myImagArray = [Float](count: len, repeatedValue: 0.0)
var cplxData = DSPSplitComplex(realp: &myRealArray, imagp: &myImagArray)
vDSP_fft_zip(setup, &cplxData, 1, vDSP_Length(logLen),FFTDirection(kFFTDirection_Forward))