主题:请教一下这段程序的含义
NMRD
[专家分:40] 发布于 2011-09-16 21:50:00
integer nvar
character*48 name1
character*4 extension
character*196 number
character*48 num1,num2,num3,num4
character*18 corname1,form
num1='010203040506070809101112131415161718192021222324'
num2='252627282930313233343536373839404142434445464748'
num3='495051525354555657585960616263646566676869707172'
num4='737475767778798081828384858687888990919293949596'
number=num1//num2//num3//num4
nvar=1
corname1= 'tab'
extension='.dat'
name1=corname1//number(2*nvar-1:2*nvar)//extension
请教一下这段程序的含义: [b]number(2*nvar-1:2*nvar)[/b]
回复列表 (共11个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-09-17 00:11:00
选取数组的一段。在这里选取的是两个字节。
板凳
NMRD [专家分:40] 发布于 2011-09-19 16:46:00
多 謝 師 兄 指 導!
實 際 上 這 個 寫 法用 起 來 還 不 是 很 方 便 。 我 希 望 能 每 次 運 行 時 自 動 生 成 一 個 文 件 序 號 ﹐ 比 如 ‘文 件 名 01’﹐ ‘文 件 名 02’﹐ 等 等。我 只 學 過 trim(adjustl( ))的 寫 法 ﹐ 可 是 這 個只 能 批 量 的 生 成 文 件 。
繼 續 請 教。
3 楼
cgl_lgs [专家分:21040] 发布于 2011-09-19 21:25:00
character filename*512,fmtstr*32
integer i
integer:: n=99 ! 需要生成多少个文件名
integer:: m=4 ! 文件名中数字所占的位数
character*8:: corname='tab' ! 文件名前缀
character*8:: extension='.dat' ! 文件扩展名
! 生成文件名所需要的格式串
write(fmtstr,'(A,I0,a,I0,a)')'(A,I',m,'.',m,',A)'
do i=1,n
! 生成文件名
write(filename,fmtstr)trim(corname),i,trim(extension)
! 生成文件名后的操作:)
! ...
write(*,*)trim(filename) ! 显示文件名,调试用:)
end do
4 楼
NMRD [专家分:40] 发布于 2011-09-19 23:40:00
多 謝 師 兄 指 導 !還 有 一 個 不 明 白 的 地 方 ﹕
我 的 程 序 現 在 改 成 這 樣 。 我 希 望 每 次 運 行 時 能 按 順 序 生 成 一 個 序 號, 而 不 是 運 行 一 次 批 量 生 成 很 多 。這 樣 查 看 文 件 時 就 指 導 運 行 了 幾 次 ﹐ 修 改 了 幾 次 PARAMETER。
program test
implicit none
integer i,j,ncmax,nmax,k
real*8 a(32,5),t1(1:32),t2(1:32)
character filename*512, fmtstr*32
integer::n=99
integer::m=4
character*8:: corname='test'
character*8:: extension='.dat'
open(unit=10,status='old',file='SAMPLE1.dat')
ncmax=2
j=0
do while (.true.)
j=j+1
read(10,*,end=111) (a(j,i), i=1,ncmax)
write(6,504)(a(j,i), i=1,2)
enddo
111 continue
nmax=31
do 999 k=1,nmax
t1(k)=a(k,1)
t2(k)=a(k,2)
999 continue
write(fmtstr,'(A,I0,a,I0,a)')'(A,I',m,'.',m,',A)'
do i=1,n
write(filename,fmtstr)trim(corname),i,trim(extension)
write(*,*)trim(filename)
end do
do 112 k=1,nmax
open(11,status='new',file=filename)
write(11,504)t1(k),t2(k)
112 continue
close(11)
close(10)
504 format(2e15.4)
end
-----SAMPLE1 DAT-----
4.000400000000000e+1 9.064600000000000e-1
3.004700000000000e+1 9.122600000000000e-1
2.257800000000000e+1 9.389800000000000e-1
1.696100100000000e+1 9.812600000000000e-1
1.274300000000000e+1 9.878300000000000e-1
9.571300000000002e+0 1.031400000000000e+0
7.191400000000000e+0 1.058300000000000e+0
5.404300000000000e+0 1.084800000000000e+0
4.059600000000000e+0 1.086100000000000e+0
3.050400000000000e+0 1.150800000000000e+0
5 楼
cgl_lgs [专家分:21040] 发布于 2011-09-20 09:15:00
那你只能把次数存到另外的文件中,然后..
character filename*512,fmtstr*32
integer i,ios
integer:: tms=0 ! 程序运行次数
integer:: n=99 ! 一次需要生成多少个文件名
integer:: m=4 ! 文件名中数字所占的位数
character*8:: corname='tab' ! 文件名前缀
character*8:: extension='.dat' ! 文件扩展名
open(1,file='times.dat') ! 运行次数
read(1,iostat=ios,*)tms ! 读取运行次数
rewind(1)
tms=tms+1
write(1,*)tms ! 将运行次数写回
close(1)
! 生成文件名所需要的格式串
write(fmtstr,'(A,I0,a,I0,a)')'(A,I',m,'.',m,',A)'
do i=1,n
! 生成文件名
write(filename,fmtstr)trim(corname),(tms-1)*n+i,trim(extension)
! 生成文件名后的操作:)
! ...
write(*,*)trim(filename) ! 显示文件名,调试用:)
end do
6 楼
NMRD [专家分:40] 发布于 2011-09-20 16:22:00
多 謝 師 兄 指 導 !
我 嘗 試 之 後 發 現 無 論 運 行 幾 次 ﹐ 都 只 在 生 成 的 TIMES里 讀 到 一 次 (顯 示 1)﹐ 文 件 名 也 總 是 TAB01。如 果在 OPEN 里 改 STATUS為 NEW﹐ 則 提 示 無 法 寫 入 同 一 個 文 件 。
以 及 :
integer:: n=1 這 裡 我 設 置 成 1﹐運 行 一 次 只 生 成 一 個 文 件 。
open(11,status='unknown',file=filename) 其 他 部 份 程 序 基 本 和 原 來 一 樣 。
7 楼
cgl_lgs [专家分:21040] 发布于 2011-09-20 16:51:00
嗯,忘写status了,不同的编译器处理方式不同:)
8 楼
NMRD [专家分:40] 发布于 2011-09-20 21:52:00
我 是 使 用 COMPAQ VISUAL FORTRAN﹐ 版 本 比 較 老 (6-1)。
現 在 的 情 況 是 即 使 有 改 STATUS﹐ 但 仍 然 沒 有 解 決 問 題 。因 為 我 要 做 很 多 次 模 擬 ﹐ 每 次 都 重 新 命 名 實 在 很 不 方 便 。 希 望 每 次 運 行 時 能 生 成 帶 序 號 的 文 件 名 。
9 楼
cgl_lgs [专家分:21040] 发布于 2011-09-21 14:41:00
open(1,file='times.dat') ! 读运行次数
read(1,iostat=ios,*)tms ! 读取运行次数
close(1)
open(1,file='times.dat') ! 写运行次数
tms=tms+1
write(1,*)tms ! 将运行次数写回
close(1)
10 楼
NMRD [专家分:40] 发布于 2011-09-21 18:12:00
Error: A * specifier is invalid at this point in the control list.
read(1,iostat=ios,*)tms
之前已经尝试过后面加上*, 提示错误 - -lll
我来回复