如何在C数组中传递或复制数据,例如
float foo[1024];
在C和Swift函数之间使用固定大小的数组,例如声明的
let foo = Float[](count: 1024, repeatedValue: 0.0)
?
我认为这不容易。 与您使用NSArray
参数不能使用C样式数组的方式相同。
Swift中的所有C数组都由UnsafePointer
表示,例如UnsafePointer
。 Swift并不真正知道数据是一个数组。 如果要将它们转换为Swift数组,您将创建一个新对象并逐个复制项目。
let array: Array = [10.0, 50.0, 40.0] // I am not sure if alloc(array.count) or alloc(array.count * sizeof(Float)) var cArray: UnsafePointer = UnsafePointer .alloc(array.count) cArray.initializeFrom(array) cArray.dealloc(array.count)
编辑
刚刚找到了更好的解决方案,这实际上可以避免复制。
let array: Array = [10.0, 50.0, 40.0] // .withUnsafePointerToElements in Swift 2.x array.withUnsafeBufferPointer() { (cArray: UnsafePointer ) -> () in // do something with the C array }
从Beta 5开始,可以使用pass和array以下示例将2个float数组传递给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))
删除了withUnsafePointerToElements()
方法,现在可以使用withUnsafeBufferPointer()
代替,并使用块中的baseAddress
方法来实现这一点
let array: Array = [10.0, 50.0, 40.0] array.withUnsafeBufferPointer { (cArray: UnsafePointer ) -> () in cArray.baseAddress }
让我们看看Apple做了什么:
需要了解更多c/c++开发分享Swift数组与C的互操作性?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
public struct float4 { public var x: Float public var y: Float public var z: Float public var w: Float /// Initialize to the zero vector. public init() /// Initialize a vector with the specified elements. public init(_ x: Float, _ y: Float, _ z: Float, _ w: Float) /// Initialize a vector with the specified elements. public init(x: Float, y: Float, z: Float, w: Float) /// Initialize to a vector with all elements equal to `scalar`. public init(_ scalar: Float) /// Initialize to a vector with elements taken from `array`. /// /// - Precondition: `array` must have exactly four elements. public init(_ array: [Float]) /// Access individual elements of the vector via subscript. public subscript(index: Int) -> Float }
以上就是c/c++开发分享Swift数组与C的互操作性?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980470.html