我正在尝试编写一个带有函数的程序,该函数返回一个矩形,在对角线上有一个随机数,在子对角线上是1,在其他地方都是0。所以,我写了这个函数:
real function am1d
do i=1,L
do j=1,L
if (i.eq.j) then
am1d(i,j)=rand()*w-w/2.
elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
am1d(i,j)=1
else am1d(i,j)=0
enddo
enddo
end function am1d
并试图从这里调用它(在相同的源文件中,在函数上方)
program make3d
integer, parameter :: L = 20
real, parameter :: w = 0.5
real :: x
!x=rand(1234) ! seed random manually
x=rand(itime) ! seed random from current local time
print *,am1d()(:)
end program make3d
但是尝试编译它会引发错误:
$ f95 make3d.f
make3d.f:18.21:
print *,am1d()(:)
1
Error: Syntax error in PRINT statement at (1)
make3d.f:7.72:
program make3d
1
make3d.f:24.72:
real function am1d
2
Error: Two main PROGRAMs at (1) and (2)
这是什么意思?我不认为某个功能可能是一个程序?我之前在endprogram语句下面有一些小的逻辑函数,没有任何问题。
答案 0 :(得分:2)
如果你想让函数am1d返回一个数组,你需要声明它。还有其他一些语法错误。编译器感到困惑....你忘记了“包含”语句......如果没有它或模块,编译器就不会“知道”如何处理另一个程序,并可能试图将其解释为第二个主程序。
尝试:
program make3d
integer, parameter :: L = 20
real, parameter :: w = 0.5
real :: x
x=rand(1234) ! seed random manually
!x=rand(itime) ! seed random from current local time
write (*, *) am1d()
stop
contains
function am1d ()
real, dimension (L,L) :: am1d
integer i, j
do i=1,L
do j=1,L
if (i.eq.j) then
am1d(i,j)=rand()*w-w/2.
elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
am1d(i,j)=1
else
am1d(i,j)=0
end if
enddo
enddo
end function am1d
end program make3d
或将例程放在一个模块中,我认为它提供了一个更清晰,更清晰的界面(使变量通信显式化) - 然后你需要在主程序中“使用”模块并传递w和L作为参数:
module a_mod
contains
function am1d (w,L)
real, intent (in) :: w
integer, intent (in) :: L
real, dimension (L,L) :: am1d
.....
end function am1d
end module a_mod
答案 1 :(得分:-2)
我遇到了同样的问题。它似乎是相同的答案。你把“END”放在标签的6个字符中。如果你只是将你的END 6字符移动得更远,它可能是魔法......