1

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ますか?
4

2 に答える 2