编译一个简单的函数会导致未定义的符号:" _main"

时间:2016-09-12 03:35:32

标签: fortran fortran90 gfortran

如何运行和执行此代码?如果我想要一个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

2 个答案:

答案 0 :(得分:1)

我注意到的一些事情。

  1. 这是一个功能,而不是程序。您应该使用PROGRAM <programname>

  2. 开始编写脚本
  3. 启动程序后,您应添加IMPLICIT NONE以避免接口出现并发症等。

  4. 如果要在程序体中定义函数或子例程 - 请遵循以下示例结构:

    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;而你基本上必须到处寻找。