回 帖 发 新 帖 刷新版面

主题:请教高手!

module mianji
   implicit none
contains
   function fun(filename) result(total)
   implicit none
   character(len=79)::filename
   integer,parameter::fileid=10
   real,dimension(1:23)::a,b
   real::s
   integer::i
   real::area=0
   real::total
   logical::alive
   inquire(file=filename,exist=alive)
   if(alive)then
   open(fileid,file=filename,status='old')
   do i=1,23
     read(fileid,*)a(i),b(i)
   end do
   write(*,'(23f6.3)')(a(i),i=1,23)
   write(*,'(23f8.4)')(b(i),i=1,23)
   else
   write(*,*)'文件不存在'
   end if
   do i=1,22
     s=((b(i+1)+b(i))/2)*(a(i+1)-a(i))
     area=area+s
   end do
   total=area
   write(*,*)'area=',total
   end function fun
end module
program jian
   use mianji
   implicit none
   character(len=79)::filename1,filename2
   real::afilename1,afilename2,atotal
   write(*,*)'filename1'
   read(*,'(A79)')filename1
   write(*,*)'filename2'
   read(*,'(A79)')filename2
   afilename1=fun(filename1)
   afilename2=fun(filename2)
   atotal=afilename2-afilename1
   print*,afilename1
   print*,afilename2
   write(*,*)'cl=',atotal
end program jian
分开计算时afilename1=-0.7092733,afilename2=-2.587754E-02。用上面程序计算得到的afilename1=-0.7092733,afilename2=-0.7351311,afilename2是错的。为什么afilename2差这么多,是不是格式设置的问题?
望您指教!

回复列表 (共15个回复)

沙发

你是不是open了文件没有关, 所以第二次进去(也是同一个文件)就会继续往下读? 没那个文件, 无法测.

板凳

输入文件呢?

3 楼

第一个文件
0.00    0.6308
0.01    -0.6977
0.03    -1.1507
0.05    -1.2798
0.1    -1.3953
0.15    -1.4337
0.2    -1.4473
0.25    -1.3991
0.3    -1.2524
0.35    -1.0661
0.4    -0.8109
0.45    -0.6327
0.5    -0.5741
0.55    -0.5287
0.6    -0.4833
0.65    -0.4348
0.7    -0.3612
0.75    -0.2985
0.8    -0.2212
0.85    -0.1747
0.9    -0.1153
0.95    -0.0557
1.0        0.00381
第二个文件
0.000    0.6308
0.005    1.1488
0.02    0.7474
0.04    0.4783
0.075    0.2379
0.125    0.0760
0.175    -0.0347
0.225    -0.0835
0.275    -0.1214
0.325    -0.1275
0.375    -0.1319
0.425    -0.1410
0.475    -0.1421
0.525    -0.1311
0.575    -0.1162
0.625    -0.1163
0.675    -0.1027
0.725    -0.0941
0.775    -0.0800
0.825    -0.0578
0.875    -0.0383
0.925    -0.0314
1.0       -0.0313

4 楼

应该不是吧。如果是那样的话计算的afilename1和afilename2应该相等啊。

5 楼

想想 这一句

real::area=0


问题就出在这里。

6 楼

module mianji
  implicit none
contains
  function fun(filename) result(total)
    implicit none
    character(len=79):: filename
    integer, parameter:: fileid = 10
    integer, parameter:: ND = 23
    real:: a(1 : ND), b(1 : ND)
    real:: s
    integer:: i
    real:: area
    real:: total
    logical:: alive
    
    inquire(file = filename, exist = alive)
    if( alive ) then
      open(fileid, file=filename, status='old')
      do i = 1, 23, 1
        read(fileid, *) a(i), b(i)
      end do
      !write(*,'(23f6.3)') (a(i),i=1, ND)
      !write(*,'(23f8.4)') (b(i),i=1, ND)
    else
      write(*, *) "File does not exist" 
    end if
    close(fileid)
    
    area = 0.0
    do i = 1, 22, 1
      s=((b(i+1)+b(i))/2)*(a(i+1)-a(i))
      area = area + s
    end do
    total = area
    write(*, *) 'area=', total
    return
  end function fun
end module

7 楼


鉴于楼主对这么多的热心同志不给分,个人认为大家不应再给予帮助

8 楼

个人认为,用 菜鸟 给我 老鸟 加分,置信度 还是很低的。
就我个人而言,有空就给 菜鸟 看看,并不是为了得到分数,这些分数,对我而言,毫无意义。

9 楼

加分 其实是对帮助人的感谢而已, 我觉得是一个比较礼貌的行为. 具体也是看发帖人, 个人也是无所谓.

不过这里我想问asymptotic一个问题, 子程序反复调用过程中临时变量确实是会有可能继承上次的值.
但是real::area=0 这样不是定义+初始化吗, 不会每次进入都过一遍?

10 楼

yeg001 网友:  在某些 Compiler 中 real:: area = 0.0  <==> real, save:: area = 0.0。
Fortran 编程的理念与 C 不一样,这一点对 从 C 过来的同志,比较不舒服。

我来回复

您尚未登录,请登录后再回复。点此登录或注册