HDF5 ファイルからの float 値 ( floatArray
) の配列があり、このデータを Unsafe[Mutable]Pointer ( ) を受け入れる関数の入力として使用したいと考えていますinputForFunction
。UnsafePointer は初めてなので、誰かの助けが必要です。
私が念頭に置いている1つの方法は、配列をファイルに保存してから開き、ファイル記述子を関数の入力用の変数のメモリにマップすることです。
// 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
が、実装方法がわかりません。参考までに、私が考えている 1 つの方法は、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
のデータのアドレスを に渡すにはinputForFunction
?- UnsafePointer<[Float]> から Unsafe[Mutable]Pointer に変換する必要がある場合、どうすればいいですか?
withMemoryRebound
必要な場合、この目的のためにどのように使用しますか?inputForFunction
アドレス/値をクロージャー内に割り当てることはできますか?floatArray
とのアドレスを確認したところ、floatArray[0]
異なっていました (C/C++ とは違うようです)。どのアドレスに渡す必要がありinputForFunction
ますか?