В Джулии, как вы переделываете тип переменной в заданном месте памяти? - PullRequest
1 голос
/ 30 мая 2019

Я использую FortranFiles.jl для взаимодействия с файлами, написанными старым кодом Fortran. В одной части данного файла строковые массивы приводятся в виде одного массива из Float64 (или Float32, в зависимости от) и сохраняются как запись на Фортране.

Я не могу найти документацию о том, как это сделать, в руководстве или в Интернете.

Таким образом, чтобы прочитать информацию, я использую что-то вроде:

fid = FortranFile("myfile.dat")
read(fid, (Float64, 10))  # which actually represents 5x 16-char strings

Как можно восстановить память из массива чисел с плавающей запятой, ограничение, данное из-за использования FortranFiles.jl и способа хранения файла, в непрерывный участок памяти, известный как символы Юлии?

Подумайте о чем-то похожем на превращение (void *) в С в (double *) и т. Д.

Спасибо.

Редактировать - Исправлен неточный комментарий выше о том, сколько строк длиной в 16 символов считывается.

1 Ответ

0 голосов
/ 03 июня 2019

Крастанов,

Спасибо.Использование reinterpret было по сути ответом.Однако я обнаружил некоторые нюансы.(Примечание: это для Julia 1.1.0)

При работе с реинтерпретацией между типами разных размеров необходимо поместить источник в массив даже для одного элемента.

Например, reinterpret(UInt8, 1.23) не будет работать.Но reinterpret(UInt8, [1.23]) будет работать.Не проблема для моего примера, так как read возвращает массив, но кое-что я заметил, когда играл в REPL.

Кроме того, тип Char является типом Unicode и рассматривается как 32-битовый тип данных, поэтому я использую UInt8 выше.

Окончательный ответ выглядит так:

fid   = FortranFile("myfile.dat")
tmp   = read(fid, (Float64, 10))  # This return an array
chars = [Char(i) for i in reinterpret(UInt8, tmp)]
...