如何运行和执行此代码?如果我想要一个10x10的数组。
我在终端中尝试了gfortran hehe.f90 -o hehe
,但收到了错误消息。我的文件名为hehe.f90
我得到的错误信息是:
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我的代码是:
function test(n)
!input
integer :: n
!output
integer :: arraytest(n,n)
!local
integer :: i,j
arraytest=0.0d0
do i=1,n
do j=1,n
arraytest(i,j)=i*i
end do
end do
end function test
答案 0 :(得分:1)
我注意到的一些事情。
这是一个功能,而不是程序。您应该使用PROGRAM <programname>
启动程序后,您应添加IMPLICIT NONE
以避免接口出现并发症等。
如果要在程序体中定义函数或子例程 - 请遵循以下示例结构:
program <programname>
implicit none
<programbody>
stop
contains
function <functionname> (<variables>) result (<variable>)
end function <functionname>
subroutine <subroutinename> (<variables>)
end subroutine (<subroutinename>)
end program <programname>
答案 1 :(得分:1)
您将test(n)
声明为子例程,因此您必须做的绝对最小值是在程序中调用它,如下所示:
program hehe
implicit none
call test(10)
contains
subroutine test(n)
implicit none
.
.
.
end subroutine test
end program hehe
但这不是你的问题的结束:虽然这会创建一个名为u
的形状(10,10)数组,并用值填充它,它会在到达时立即忘记它子程序结束。
如果你想保留u
,你必须更多地参与其中:
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
call test(n, u)
contains
subroutine test(n, u)
implicit none
integer, intent(in) :: n
integer, intent(out) :: u(n, n)
< populate u >
end subroutine test
end program hehe
因为你仍然没有对u
做任何事情,所以仍然有可能任何编译器会秘密地放弃u
的不必要的计算,但是如果你,例如,打印出来,它应该做你期望的。
你也可以使用一个函数:
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
u = test(n)
contains
function test(n) result(v)
implicit none
integer, intent(in) :: n
integer :: v(n, n)
< populate v >
end function test
end program hehe
(我在函数中使用v
来表明两个变量名称不必相同。test(n)
将返回一个2D数组,以及你是什么存储由你决定。)
还有一个选项我希望包含完整性,但我不鼓励你使用:放在程序的contains
部分内的程序(子程序和函数)都可以访问程序的变量,除非使用相同的名称显式声明新变量,所以这也可以工作:
program hehe
implicit none
integer, parameter :: n = 10
integer :: u(n, n)
call test()
write(*, '(10I6)') u
contains
subroutine test()
implicit none
integer :: i, j ! n and u not declared here, taken from program.
u = reshape((/((100*i + j, i = 1, n), j = 1, n)/), (/n, n/))
end subroutine test
end program hehe
我之所以不喜欢这样,是因为如果出现问题,要理解它是一团糟。你立即开始怀疑:&#34; u
在哪里改变了?&#34;而你基本上必须到处寻找。