Как мне преобразовать массив UnsafeMutablePointer <Double>в массив Double? - PullRequest
0 голосов
/ 31 марта 2019

Я создал такой массив

var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: numeroDados)

Теперь мне нужно преобразовать его в массив Double.

Я могу преобразовать это, используя что-то вроде этого:

var newArray : [Double] = []

for i in 0..<n {
  newArray[i] = outputReal
}

Но я помню, как видел на странице другой способ сделать это.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 31 марта 2019

Сначала создайте UnsafeBufferPointer<Double>, ссылаясь на ту же область памяти.Это Collection, так что вы можете создать и инициализировать массив из этой памяти:

let bufPtr = UnsafeBufferPointer(start: outputReal, count: numeroDados)
let newArray = Array(bufPtr)

В качестве альтернативы, выделите UnsafeMutableBufferPointer (который содержит как адрес, так и размер выделенной памяти) впервое место:

let numeroDados = 10

let outputReal = UnsafeMutableBufferPointer<Double>.allocate(capacity: numeroDados)
outputReal.initialize(repeating: 0.0)

let newArray = Array(outputReal)

В обоих случаях значения копируются в хранилище элементов массива, поэтому в конечном итоге вам придется освободить выделенную память.

1 голос
/ 31 марта 2019

Вы хотите преобразовать указатель в удвоенный в массив двойных ??

Вы не должны приводить указатель на удвоение к массиву double в swift, так как массив в swift не обязательно совпадает с массивом C. Вместо этого вы копируете содержимое в новый массив. «Низкоуровневый» способ сделать это -

var pointerToDoubles = UnsafeMutablePointer<Double>.allocate(capacity: 10)
var newArray = Array<Double>(repeating: 0, count: 10)
_ = newArray.withContiguousMutableStorageIfAvailable {
  UnsafeMutableRawPointer($0.baseAddress!).copyMemory(from: x, byteCount: MemoryLayout<double>.size * 10)
}

Пожалуйста, имейте в виду, что это не безопасно, и произойдет сбой, если вы допустили некоторые ошибки, например, ваш новый массив слишком мал или если ваш указатель не содержит столько ожидаемых элементов.

...