Как я могу получить доступ к буферу памяти, отображенному в быстрой структуре? - PullRequest
0 голосов
/ 08 мая 2019

Это, наверное, тривиально для вас, но я новичок в Swift и не могу найти ответ.Я использую код C для преобразования данных из TCP / IP, все работает нормально.Но когда я пытаюсь отправить данные обратно в Swift, я получаю сообщение об ошибке: значение типа «UnsafeMutablePointer» не имеет члена «x» (во время компиляции).

Проще говоря, мой код C генерирует структуручто я хочу, чтобы мой быстрый код читал и использовал структуру для доступа к полям.Примечание. Я НЕ ХОЧУ КОПИРОВАТЬ ДАННЫЕ (пример здесь прост, но я имею дело с МБ (ГБ).

override func viewDidLoad()
{
  struct MyStruct1
  {
    var x   : UInt32        
    var y   : UInt32
  }
  var buffer : UnsafeMutablePointer<UInt8>?
  //...
  buffer = UnsafeMutablePointer<UInt8>.allocate( capacity: Int(1024) )
  if (buffer != nil)
  {
     defer { buffer!.deallocate() }
     // CCode_That_Initializes_Buffer( buffer ) with An array of MyStruct
     var myStructP : UnsafeMutablePointer<MyStruct1>
     myStructP = UnsafeMutableRawPointer(buffer!).assumingMemoryBound(to: MyStruct1.self)
     // Value of type 'UnsafeMutablePointer<MyStruct1>' has no member 'x'
     print( myStructP.x ) // <= This does not compile
  }
}

1 Ответ

0 голосов
/ 08 мая 2019

Нельзя отобразить буфер, выделенный как небезопасный необработанный указатель, в структурную переменную Swift без копирования.

Структурная переменная Swift имеет другие языковые свойства, так что вы можете получить доступ только к содержимому структурной переменной Swift черезуказатель, если эта переменная была назначена Swift как тот же тип структуры (например, не как небезопасный указатель, переданный ему C).

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

Или просто используйте структуру C через соединительный заголовок.

...