【发布时间】:2017-04-13 08:44:12
【问题描述】:
我需要使用一个用 fortran-77 编写的旧程序。该程序以十六进制格式从文本文件中读取 10 个变量
open (2,file=filename, status='old', iostat=ios)
read (2,1) my_variables
1 format (/(10z8))
其中一个变量是字符串(字符*4),我想将十六进制的“414E4950”之类的东西转换为“ANIP”。 但问题是当我尝试从文件中读取数据时出现错误。
Fortran 运行时错误:整数读取期间值溢出
我该如何解决?
编辑
看来我把问题简化得太多了。 我的数据文件看起来像:
DATA_BLOCK_NAME
3D3 1 23BE 0 0 0 0 0 0 0
041200000414E4950 03F800000 0 16 23BF 0 0
0 0 0 0 0 041200000414E4950 03F800000
0 1E 23C0 0 0 0 0 0 0 0
我想将这些数据读入变量。
read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
+ name(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)
obj_num 为整数*4 var_1 是整数数组*4 var_2, var_3, var_4, var_5, var_6 是实数数组 但是(!)名称是字符串数组(字符* 4)
正如您在数据文件中看到的每 12 个值编码的对象名称(例如“414E4950”到“ANIP”),我想将其存储为字符串。
附言
为了修复程序,我写了一个小但很脏的修复程序。
read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i),
+ tmp(i),var_4(i),var_5(i),var_6(i),i=1,obj_num)
do j=1,numcn
do i=1,4
tmp_name( i:i ) = CHAR(MOD(tmp(j), 256))
tmp(j) = RSHIFT(tmp(j), 8)
end do
ccns(j) = tmp_name
end do
其中tmp是整数*4数组,tmp_str是字符*4 它很丑,但很有效。
【问题讨论】:
-
“一个变量是字符串”是什么意思?
Z编辑描述符用于数字类型。也许您可以展示my_variables的真正含义,以及它/那些是如何声明的? -
当我解开这个陈述时(我是实验室的大三学生,不知道 fortran ;() 读取 (2, 1) 读取十个数值并尝试将其分配给列表中的变量。每个列表中的变量具有数字类型(整数*4 或浮点*8),但一个具有字符*4 类型。
-
事情变得有点复杂,因为
Z不在 Fortran 77 中。如果您确实有一个声称适用于 F77 编译器的程序,这可能意味着它允许对 @ 进行不同的解释987654328@。但是,在标准 Fortran 中,Z只能用于整数、实数和复数变量的输入。变量列表必须与格式匹配:如果要读入字符变量,则必须将该变量与格式中的合适条目匹配。 -
谢谢!所以我需要改变阅读格式,对吗?以及如何将十六进制值解码为字符串?
-
也许您应该/可以更全面地解释您正在尝试做什么。 Fortran 可以非常轻松地从整数变量中读取和写入十六进制值。它甚至可以将整数值写入包含十六进制数字的字符串中,以便作为字符串进一步处理。但是我只是不明白您所说的 decode hexademical value to string 之类的短语是什么意思。