Я создал такой массив
var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: numeroDados)
Теперь мне нужно преобразовать это в массив Double
.
Я могу преобразовать это, используя что-то вроде этого:
var newArray : [Double] = []
for i in 0..<n {
newArray[i] = outputReal
}
Но я помню, что видел на странице другой способ сделать это.
Есть идеи?
Вы имеете в виду преобразовать указатель в двойной массив двойных значений ??
Вы не должны указывать указатель на double для массива 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)
}
Имейте в виду, что это безопасно для нет и произойдет сбой, если вы допустили некоторые ошибки, например, ваш новый массив слишком мал или если ваш указатель не содержит столько элементов, сколько вы ожидаете.
Сначала создайте 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)
В обоих случаях значения равны скопировано для хранилища элементов массива, поэтому в конечном итоге вам придется освободить выделенную память.
Спасибо, вы помогли мне понять, что мне нужен был не Array
, а коллекция / UnsafeMutableBufferPointer
вместо UnsafeMutablePointer
. Это избавляет от Array
init, за которым следует неприглядно избыточный withUnsafeMutableBytes
!
extension UnsafeMutablePointer {
func toArray(capacity: Int) -> [Pointee] {
return Array(UnsafeBufferPointer(start: self, count: capacity))
}
}
var array = [3.9, 7.7, 11.1, 1.11, 1.02, 3.3, 3.9, 0]
let pointer = UnsafeMutablePointer<Double>.allocate(capacity: array.count)
pointer.initialize(from: &array, count: array.count)
print(pointer.toArray(capacity: array.count))
extension Array {
init(pointer: UnsafeMutablePointer<Element>, count: Int) {
let bufferPointer = UnsafeBufferPointer<Element>(start: pointer, count: count)
self = Array(bufferPointer)
}
}
var array2 = [3.9, 7.7, 11.1, 1.11, 1.02, 3.3, 3.9, 0]
let pointer2 = UnsafeMutablePointer<Double>.allocate(capacity: array.count)
pointer2.initialize(from: &array, count: array.count)
print(Array(pointer: pointer2, count: array.count))
Блестяще, спасибо! Я изменил принятый ответ на ваш.
Великолепно! Вот и все! Вы знаете, где я могу прочитать об этом безопасном/небезопасном/изменяемом указателе/буфере, который хорошо объясняет это? В любом случае, спасибо!!!!!