Как преобразовать массив UnsafeMutablePointer<Double> в массив Double?

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

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

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

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

var newArray : [Double] = []

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

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

Есть идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 061
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы не должны указывать указатель на 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)

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

Великолепно! Вот и все! Вы знаете, где я могу прочитать об этом безопасном/небезопасном/изменяемом указателе/буфере, который хорошо объясняет это? В любом случае, спасибо!!!!!

Duck 31.03.2019 16:27

Спасибо, вы помогли мне понять, что мне нужен был не Array, а коллекция / UnsafeMutableBufferPointer вместо UnsafeMutablePointer. Это избавляет от Array init, за которым следует неприглядно избыточный withUnsafeMutableBytes!

Rhythmic Fistman 28.08.2019 22:50
Ответ принят как подходящий

Подробности

  • Xcode 11.2.1 (11B500), Swift 5.1

Решение 1

extension UnsafeMutablePointer {
    func toArray(capacity: Int) -> [Pointee] {
        return Array(UnsafeBufferPointer(start: self, count: capacity))
    }
}

Использование решения 1

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))

Решение 2

extension Array {
    init(pointer: UnsafeMutablePointer<Element>, count: Int) {
        let bufferPointer = UnsafeBufferPointer<Element>(start: pointer, count: count)
        self = Array(bufferPointer)
    }
}

Использование решения 2

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))

Блестяще, спасибо! Я изменил принятый ответ на ваш.

Duck 21.11.2019 12:45

Другие вопросы по теме