У меня есть массив с плавающей запятой (floatArray
), идущий из файла HDF5, и я бы хотел использовать эти данные в качестве входных данных для функции, которая принимает Unsafe [Mutable] Pointer (inputForFunction
). Я новичок в UnsafePointer, поэтому мне нужна чья-то помощь.Как преобразовать UnsafePointer <[Float]> или поместить данные Float Array в Unsafe [Mutable] Pointer <Float> в Swift 3?
Один из способов я имею в виду, чтобы сохранить массив в файл, а затем открыть его и отобразить дескриптор файла в памяти переменной для ввода функции:
// read the data from HDF5 file
var floatArray: [Float] = try originalHDF5DataSet.read()
// store the data
let dataToStore = NSData(bytes: &floatArray, length: sizeOfArray * MemoryLayout<Float>.size)
let tmpPath = URL(fileURLWithPath: NSTemporaryDirectory())
let filePath = tmpPath.appendingPathComponent("floatArrayData").appendingPathExtension("dat")
do{
try data.write(to: filePath, options: .atomic)
let fileManager : FileManager = FileManager.default
if fileManager.fileExists(atPath:filePath.path){
print("Success")
}else{
print("Fail")
}
// open the data
let dataPath = filePath.path
let fd = open(dataPath, O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
assert(fd != -1, "Error: failed to open output file at \""+dataPath+"\" errno = \(errno)\n")
// memory map the parameters
let hdr = mmap(nil, Int(sizeOfArray), PROT_READ, MAP_FILE | MAP_SHARED, fd, 0)
// cast Void pointers to Float
let inputForFunction = UnsafePointer<Float>(hdr!.assumingMemoryBound(to: Float.self))
} catch{
print("failed")
}
Однако это может быть не самая лучшая реализация, потому что процесс хранения данных кажется трудоемким.
Вот почему я планирую использовать UnsafePointer для передачи указателя от floatArray
до inputForFunction
, но я не уверен, как его реализовать. Просто для информации, один способ, которым я имею в виду, чтобы использовать withUnsafePointer
метод непосредственно:
var floatArray: [Float] = try originalHDF5DataSet.read()
var inputForFunction = UnsafeMutablePointer<Float>.allocate(capacity: Int(sizeOfArray))
withUnsafePointer(to: &floatArray[0]) { (ptr: UnsafePointer<Float>) in
inputForFunction = UnsafeMutablePointer(mutating: ptr)
}
или другой способ заключается в использовании withMemoryRebound
(но следующее не работает):
var floatArray: [Float] = try originalHDF5DataSet.read()
var inputForFunction = UnsafeMutablePointer<Float>.allocate(capacity: Int(sizeOfArray))
withUnsafePointer(to: &floatArray) { (ptrDataArray: UnsafePointer<[Float]>) in
inputForFunction = ptrDataArray.withMemoryRebound(to: inputForFunction.self, capacity: Int(sizeOfArray), { (ptr: UnsafePointer<[Float]>) -> UnsafeMutablePointer<Float> in
return ptr[0]
})
}
Мой вопрос
- Как передать адрес данных
floatArray
«S вinputForFunction
? - Если мне нужно преобразовать из UnsafePointer < [Float]> в Unsafe [Mutable] Pointer, как это сделать?
- При необходимости, как использовать
withMemoryRebound
для этой цели? Могу ли я присвоить адрес/значениеinputForFunction
внутри крышки? - Когда я проверил адреса
floatArray
иfloatArray[0]
, они были разными (это кажется отличным от C/C++). Какой адрес следует передатьinputForFunction
?
Как * точно * является функцией, объявленной для передачи данных? –
Это для CNN на iOS. вход для kernelWeights и смещения. инициализации (устройство: MTLDevice, convolutionDescriptor fullyConnectedDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer, biasTerms: UnsafePointer , флаги:? MPSCNNConvolutionFlags) [Справочник по API из 'withUnsafeBufferPointer'] –
kangaroo