2

我需要有关 Fortran 中隐式执行循环的帮助。这是我的简单代码:

Program Simple

Implicit none

Integer::i,j
Integer,parameter::N=2,M=3
Real,dimension(N,M)::Pot

Open(1,File='First.txt',Status='old')

    Read(1,'(M(f3.1,1x))') ((Pot(i,j),j=1,M),i=1,N)

Close(1)

Open(2,File='Second.txt',Status='Unknown')

    Write(2,'(M(i0,1x,i0,1x,f3.1,1x))') ((i,j,Pot(i,j),j=1,M),i=1,N)

Close(2)

Stop
End program Simple

这是文件First.txt

1.1 1.2 1.3
2.1 2.2 2.3

当我尝试执行这个程序时,我收到了一条消息:

Unexpected element 'N' in format string
Unexpected element 'M' in format string

我想在写语句中保留整数变量 N 和 M 的名称。有没有办法让他们的价值观也不受声明部分的影响?

4

1 回答 1

3

您在字符串中使用Mand N(作为字符),而不是作为变量。为了使用变量,您需要将它们的值写入格式字符串:

character(len=128) :: fmtString
!...
write(fmtString,*) M
fmtString = '('//trim(adjustl(fmtString))//'(f3.1,1x))'
Read(1,fmtString) ((Pot(i,j),j=1,M),i=1,N)

同样的write声明。

但是,您可能可以使用列表导向输入 ( Read(1,*)) 作为输入,并让 Fortran 找出确切的格式。

您可以(*(f3.1,1x))在现代编译器中使用这种字符串操作来代替这种字符串操作,或者如果您有一个旧编译器,只需指定一个非常大的数字,例如(99999(f3.1,1x)). 在这两种情况下,将打印正确数量的值。m*n但是,这将导致在一行中写入所有值[感谢@agentp 指出这一点]。

于 2016-03-12T12:17:20.947 回答