li913 发表于 2020-5-17 20:15 谢谢李老师,彻底明白了!感谢您的指点!继续前行,加油! |
1、equivalence(b,n), 二者的二进制表示形式一样(同一块内存),但值不一样; 2、n=b, 值一样(或近似,存在取舍), 二进制不一样。 3、文件中的某个地址上的值,到底是整型还是实型,需要通过判断才能确定,但不管是啥类型,二进制形式是相同的(文件不会改变)。 4、参考 http://fcode.cn/guide-120-1.html |
我思考了下,是因为共用一块地址,地址里的值是二进制的,如010110,那么分别用不同类型的变量取值这段二进制的值时,就会翻译为相应的数据类型值。而n=b这种是数据上的强制转换 |
本帖最后由 evanustc 于 2020-5-17 20:04 编辑 li913 发表于 2020-5-17 16:13 李老师,请收下我的膝盖orz....太厉害了。在结合工具代码的基础上,阅读您的代码,我明白了意思。在您的代码里,有一项我不太明白原理,就是a(1)读进来的时候还是REAL型的小数,但是在最后的循环中,使用了 b=a(1),然后整形n就成了74了。。。 equivalence(b,n)这一句,实型b和整型n共用同一块内存地址,是由于整型和实型的原因导致取同一块地址里的值时导致不一样的吗?为啥不用n=b转换呢 |
本帖最后由 li913 于 2020-5-17 17:51 编辑 研究了两天,发现这个代码是比较奇葩的,典型的国外开源代码风格,故意让人看不懂(也可能是代码太老了)。核心也就那么十来行。将所有数据读入数组,通过一定规则(numchk函数)判断每个数据的真实类型(real 或 integer),然后每6个数据输出一行。 [Fortran] 纯文本查看 复制代码 !判断数据是整数还是实数 subroutine numchk (ia,icode) character aho*7 write(aho,'(i7)') ia if(aho.eq.'*******') then icode = 0 else icode = 1 endif end program test implicit none integer(4) m, n, i, j, k real,allocatable:: a(:) real b equivalence(b,n) character cl*3 !读取 open(10,file='FASTLIB', ACCESS='SEQUENTIAL',FORM='UNFORMATTED') read(10) m allocate(a(m)) !分配空间 rewind(10) read(10) m, a(1:m) close(10) !输出 open(10,file='out.txt') k=0 do i = 1, m b = a(i) k=k+1 if(mod(k,6)==0) then !每6个数据输出一行 cl = 'yes' else cl = 'no' end if call numchk(n,j) !判断数据是整数还是实数 if(j==0) then write(10,'(1pe12.5)', advance=cl) b else write(10,'(4x,i7,1x)',advance=cl) n end if end do end |
QQ截图20200517160850.png (106.58 KB, 下载次数: 360)
1.png (81.34 KB, 下载次数: 335)
necrohan 发表于 2020-5-17 12:49 是的,二进制读入没有问题。我明白您的意思,只是有点疑惑的就是小工具中关于二进制代码读取的部分: DIMENSION WORK(1) OPEN(UNIT=IOPDS, FILE=FILNAM, ERR=100, STATUS='UNKNOWN', & ACCESS='SEQUENTIAL', FORM='UNFORMATTED',IOSTAT=IOS) READ(UNIT=IOPDS,ERR=300,IOSTAT=IOS) LENG,(WORK(I),I=1,LENG) CLOSE(UNIT=IOPDS, ERR=200, STATUS='KEEP',IOSTAT=IOS) RETURN74 WORK声明的是数组,也没有指定类型,在UBUNTU下编译后,转出的10进制文件是正确的。我推断WORK中即读入了整型也有实型,不然打印成十进制不可能对的上。这部分我在win下实现后就出现了我刚才问的问题,屏幕输出的前4个本应该是74 10 22 45却变为了神秘小数。。 |
evanustc 发表于 2020-5-17 11:34 整数和浮点数在二进制文件里表示方法不一样,不能通用,否则读出来数据是错的。 你附件那个二进制文件按6楼的方式读没问题。 |
我把 DIMENSION WORK(300)改为INTEGER WORK(300) 能够读入74 10 22 45但是后面小数就不行了,读的全是整数。如果WORK为REAL型,为啥不能把74当做74.0读入呢?类似C++里面的读入处理 |
有点激动,整了快2天的时间,对Fortran理解不少,太有意思了 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-12-23 18:33