Converting C array ptr to native array in Swift 3

John Scalo

I have a ptr from a C library that points to an array of Floats. Its type is UnsafeMutablePointer. How do I create a native [Float] array from this in Swift 3?

Here's what I'm trying:

var reconstructedFloats = [Float](repeatElement(0, count: size))
reconstructedFloats.withUnsafeMutableBufferPointer {
  let reconstructedFloatsPtr = $0
  print(type(of:$0)) // "UnsafeMutableBufferPointer<Float>"
  cFloatArrayPtr?.withMemoryRebound(to: [Float].self, capacity: size) {
    UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: $0.pointee, as: Float.self)
  }

UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: (cFloatArrayPtr?.pointee)!, as: Float.self)
}

That seems insanely overcomplicated so hopefully there's an easy way, but even this code produces a compile error: Type of expression is ambiguous without more context.

If you want to plug it into a playground, here's a complete sample that contrives the cFloatArrayPtr:

// Let's contrive a C array ptr:
var size = 3
var someFloats: [Float] = [0.1, 0.2, 0.3]
var cFloatArrayPtr: UnsafeMutablePointer<Float>?

someFloats.withUnsafeMutableBufferPointer {
    cFloatArrayPtr = $0.baseAddress
}

print(type(of:cFloatArrayPtr!)) // "UnsafeMutablePointer<Float>"

var reconstructedFloats = [Float](repeatElement(0, count: size))
reconstructedFloats.withUnsafeMutableBufferPointer {
    let reconstructedFloatsPtr = $0
    print(type(of:$0))
    cFloatArrayPtr?.withMemoryRebound(to: [Float].self, capacity: size) {
        UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: $0.pointee, as: Float.self)
    }

    UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: (cFloatArrayPtr?.pointee)!, as: Float.self)
}

print(reconstructedFloats)
zneak

You can make an UnsafeBufferPointer from your pointer. UnsafeBufferPointer is a Sequence, so you can directly make an array from it:

let buffer = UnsafeBufferPointer(start: cFloatArrayPtr, count: size)
var reconstructedFloats = Array(buffer)

Of course, this creates a copy.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Converting array of C strings to Swift string array

From Dev

Converting an Objective C array declaration to Swift

From Dev

Converting Swift array to CFArray in Xcode 8 (Swift 3)

From Dev

react native converting array into string

From Dev

Swift converting Byte Array into String

From Dev

Converting JSON to array in Swift 2

From Dev

Swift converting Byte Array into String

From Dev

Converting String array to CGFloat array in Swift

From Dev

Converting 3D-Array to List in C#

From Dev

Converting a C char array to a String

From Dev

Converting C array operations to Assembly

From Dev

C Converting Char array (strings) into int array

From Dev

Converting a String Array into an Int Array in C#

From Dev

Converting Swift array of [Int64] into NSArray

From Dev

Converting an UnsafePointer with length to a Swift Array type

From Dev

Converting swift array into object for json serialization

From Dev

Error converting static Swift Array in Enum to NSArray

From Dev

Swift Converting PFQuery to String Array for TableView

From Dev

Converting Array Of String to Double and then calculating the sum in Swift

From Dev

Convert native swift Set into array

From Dev

converting nested XML to 3d array

From Java

Converting a database result of 3 columns to associative array

From Dev

Converting a 3GB file into a byte array

From Dev

What data type should I use when converting a byte array from Swift to Objective-C

From Dev

c++ - array of shared_ptr

From Dev

C Array Equivalent in Swift

From Dev

Converting 3-dimensional byte array to a single byte array

From Dev

Converting 2d array into 3d array in python

From Dev

Converting 2d array into 3d array in python

Related Related

HotTag

Archive