【问题标题】:Undefined reference to a function in a module对模块中函数的未定义引用
【发布时间】:2017-04-14 11:26:57
【问题描述】:

我正在浏览所有其他关于未定义引用的线程,但我无法弄清楚为什么这段代码不起作用。我基本上是在尝试将模块中的函数运行到主程序中的子例程中。但我一直收到错误

主要:

    program main
        use m1
        implicit none
        integer, dimension(:,:), allocatable :: A,AFun
        integer :: n,i,j
        print *, "enter value for n"
        read *, n
        do i=1,n
                do j=1,n
                        A(i,j)=i**2-j**3
                end do
        end do
        print *, "Matrix A: "
        call prMat(A,n)
        call matFun(A,AFun,n)
        print *, "Matrix AFun:"
        call prMat(AFun,n)
        call fromAvg(AFun,n)

        contains
        subroutine prMat(x,n)
                implicit none
                integer, dimension(n,n) :: x
                integer :: i,j,n
                do i=1,n
                        write(*,*), (x(i,j))
                end do
        end subroutine prMat


        subroutine matfun(x,y,n)
                implicit none
                integer, dimension(n,n) :: x,y
                integer :: i,j,n,f1
                do i = 1,n
                        do j=1,n
                                y(i,j)=f1(x,i,j,n)
                        end do
                end do

        end subroutine matFun
    subroutine fromAvg(x,n)

            integer, dimension(:,:) :: x
            integer :: i,j,n
            integer :: s,avg,g,b
            s=0; g=0; b=0
            do i=1,n
                    do j=1,n
                            s=s+x(i,j)
                    end do
            end do
            avg=s/(n*n)

            do i = 1,n
                    do j = 1,n
                            if ( x(i,j) > avg ) then
                                    g =  g + 1
                            else
                                    b = b + 1
                            end if
                    end do
            end do


            print *, "In from avg, average=", avg
            print *, "Number of values greater than average is ",g
            print *, "Number of values less than average is ",b
    end subroutine fromAvg

        integer, dimension(:,:), allocatable, intent(IN) :: x
        integer :: i,j,n
        integer :: s,avg,g,b
        s=0; g=0; b=0
        do i=1,n
                do j=1,n
                        s=s+x(i,j)
                end do
        end do
        avg=s/(n*n)

        do i = 1,n
                do j = 1,n
                        if ( x(i,j) > avg ) then
                                g =  g + 1
                        elseif ( x(i,j) < avg ) then
                                b = b + 1
                        end if
                end do
        end do


        print *, "In from avg, average=", avg
        print *, "Number of values greater than average is ",g
        print *, "Number of values less than average is ",b
end subroutine fromAvg

end program main

模块功能:

module m1
implicit none
private
public :: f1
contains
function f1(x,p,q,n)
        integer, dimension(:,:) :: x
        integer, intent(in) :: p,q,n
        integer :: i,f1
        f1=0
        do i = 1,n
                f1 = f1 + x(p,n)
        end do
        do i = 1,n
                f1 = f1 + x(n,q)
        end do

end function f1
end module m1

我不断收到的错误如下:

/tmp/ccKZHw7L.o: In function `matfun.1520':
lab4_b.f90:(.text+0x808): undefined reference to `__m1_MOD_f1'
collect2: ld returned 1 exit status

我错过了什么吗?在implicit none 语句之前,我的主程序开头有use m1

【问题讨论】:

  • 这行得通吗?

标签: module fortran undefined fortran90 subroutine


【解决方案1】:

在子程序matfunf1被(重新)声明为整数,在行中

        integer :: i,j,n,f1

这有效地掩盖了模块功能。由于代码(正确)使用包含f1 的模块,因此不应在子例程中声明。

然后我的编译器抱怨没有fromavg 的定义,但我想你知道。

【讨论】:

  • 所以看起来它按照您指出的那样进行了编辑,并且似乎已经完成了欺骗。刚刚收到另一个错误,但在来这里寻找解决方案之前会尝试解决它。谢谢
  • 我通常不在程序中使用 CONTAINS。这是否可以避免在子程序中需要“USE m1”?
  • 所以再次运行它并在出现分段错误后运行 -fcheck=all 错误,我似乎再次遇到问题,同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2011-09-19
  • 2017-10-17
  • 1970-01-01
  • 2012-05-24
相关资源
最近更新 更多