Fortran问题汇总

1.Fortran 77 程序 COMMON
在main 程序里出现的所有 common /source/ ,在function 中得写全,否则会报错

2.DO 循环误区

1
2
3
4
5
6
do i=1, 2
do k=1, 2
j = i + k
end do
end do
print *, i , j, k

打印出来的结果为

1
3 4 3

j=4这个很好理解,但是ik为什么等于3?
原因在于do i=1, 2实际上相当与do i=1, 2, 1,这条语句的意思就是
i=1开始执行循环内的语句,执行完后增加1(最后面的那个数表示增量),
中间那个2i能够继续循环体的最大取值。所以当i=2执行完循环体后,会先
增加1,然后再判断i<=2,若i>2则跳出循环。

简单来讲do循环是先增值,再判断循环体条件,最后再运行循环体。

3.program 名字不能与内置函数相同
如题, fortran program 名字不能与内置函数的名字相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PROGRAM matmul
IMPLICIT NONE
REAL, DIMENSION(2, 4) :: A = RESHAPE((/1.0, -6.0, -5.0, -4.0, 4.0, 2.0, 2.0, 2.0/), (/2, 4/))
REAL, DIMENSION(4, 3) :: B = RESHAPE((/1.0, 2.0, 0.0, 0.0, -2.0, 3.0, -1.0, -3.0, -1.0, 4.0, 2.0, 1.0/), (/4,3/))
REAL, ALLOCATABLE, DIMENSION(:, :) :: C
!REAL, DIMENSION(2, 2) :: C
INTEGER :: i, j
C = MATMUL(A , B)
WRITE(*,*) '##############################################'
WRITE(*, "(1X, 4F7.2)") ((A(i, j), j=1,4), i=1,2)
WRITE(*,*) '##############################################'
WRITE(*, "(1X, 3F7.2)") ((B(i, j), j=1,3), i=1,4)
WRITE(*,*) '##############################################'
WRITE(*, "(1X, 3F7.2)") ((C(i, j), j=1,3), i=1,2)
END PROGRAM matmul

这个程序将 program 设为matmul, 与 fortran 内置的 MATMUL 重名了,导致编译时报错。应将Program 修改为其他名字,再编译运行

您的支持将是我前进的不懈动力