在Julia中,如何在给定的内存位置重铸变量类型?

时间:2019-05-29 22:51:15

标签: memory types julia

我正在使用FortranFiles.jl与旧的Fortran代码编写的文件进行交互。在给定文件的一部分,字符串数组被转换为Float64(或Float32,取决于)的单个数组,并存储为Fortran记录。

我似乎找不到手册或在线上的文档。

因此,要阅读信息,我使用的是类似的东西:

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

如何将Floats数组(由于使用FortranFiles.jl和文件存储方式而产生的约束)中的内存重铸到连续的内存区(朱莉娅称为字符)?

想像类似于将C中的(void *)变成(double *)等的情况……

谢谢。

1 个答案:

答案 0 :(得分:0)

克拉斯坦诺夫,

谢谢。使用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)]