我有一个简单的函数,它返回一个基于时间字符串的时间对象:
FUNCTION getTime(timeStr)RESULT(time)
IMPLICIT NONE
CHARACTER(LEN=19),INTENT(IN) :: timeStr
TYPE timeType
INTEGER :: yyyy,mo,dd,hh,mm,ss
ENDTYPE timeType
TYPE(timeType) :: time
READ(UNIT=timeStr( 1: 4),'(I4)')time%yyyy
READ(UNIT=timeStr( 6: 7),'(I2)')time%mo
READ(UNIT=timeStr( 9:10),'(I2)')time%dd
READ(UNIT=timeStr(12:13),'(I2)')time%hh
READ(UNIT=timeStr(15:16),'(I2)')time%mm
READ(UNIT=timeStr(18:19),'(I2)')time%ss
ENDFUNCTION getTime
Run Code Online (Sandbox Code Playgroud)
我从父例程中将其称为:
umwmTime1=getTime(umwmStartTimeStr)
umwmTime2=getTime(umwmStopTimeStr)
Run Code Online (Sandbox Code Playgroud)
其中umwmTime 1和2声明为:
TYPE timeType
INTEGER :: yyyy,mo,dd,hh,mm,ss
ENDTYPE timeType
TYPE(timeType) :: umwmTime1,umwmTime2
Run Code Online (Sandbox Code Playgroud)
我得到的编译错误消息是:
PGF90-S-0099-Illegal use of derived type (ESMF_interface_UMWM.F90: 282)
PGF90-S-0099-Illegal use of derived type (ESMF_interface_UMWM.F90: 283)
0 inform, 0 warnings, 2 severes, 0 fatal for umwm_component_run
Run Code Online (Sandbox Code Playgroud)
第282行和第283行是父例程中的函数调用.
但是,如果我使用子程序(而不是函数)将umwmTime1和umwmTime2作为INTENT(OUT)参数,我没有遇到任何问题.我的功能有什么问题?
我正在使用Fortran对大量数据集进行计算,这些数据集被分成许多文件.文件名是:
maltoLyo12per-reimage-set1.traj
maltoLyo12per-reimage-set2.traj
maltoLyo12per-reimage-set3.traj
Run Code Online (Sandbox Code Playgroud)
我编写的代码用于计算如下:
fileLoop: do j = 31, 34
OPEN(unit=31,status='old',file=fileplace//'maltoLyo12per-reimage-set1.traj')
OPEN(unit=32,status='old',file=fileplace//'maltoLyo12per-reimage-set2.traj')
OPEN(unit=33,status='old',file=fileplace//'maltoLyo12per-reimage-set3.traj')
OPEN(unit=34,status='old',file=fileplace//'maltoLyo12per-reimage-set4.traj')
... operation....
close (j)
end do fileLoop
Run Code Online (Sandbox Code Playgroud)
在运行期间,我希望代码一次打开每个文件,并在完成计算后关闭它们.但是上面的代码将立即打开所有文件,并在完成计算后逐个关闭它们.
所以我试着改变代码,如下所示:
fileLoop: do j = 31, 34
OPEN(unit=j,status='old',file=fileplace//'maltoLyo12per-reimage-set1.traj')
close (j)
end do fileLoop
Run Code Online (Sandbox Code Playgroud)
但在这里我遇到了文件名的问题.每次循环运行时,文件名都不会因文件名中的短语"set1"而改变.我希望文件名中的数字更改为set1,set2,set3等,随后文件单元号为31,32,33,34等.
当我做:
REAL FUNCTION f(x)
REAL, INTENT(IN) :: x
f = exp(-x)
END FUNCTION f
Run Code Online (Sandbox Code Playgroud)
它有效,但如果我这样做:
REAL FUNCTION f(x)
REAL, INTENT(IN) :: x
f = exp(-x^2)
END FUNCTION f
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Error: Syntax error in argument list at (1)
Run Code Online (Sandbox Code Playgroud)
但我需要的x^2功能不是x.该怎么办?
如何在指定条件下打印文件中的一行,例如,如果一行中有 251212,我如何让我的程序只打印该特定行。感谢您的帮助,谢谢。