2016-11-30 11 views
0

未定義の参照に関して他のすべてのスレッドを調べていたので、なぜこのコードが機能していないのかわかりませんでした。私は基本的に、モジュールからメインプログラムのサブルーチンに関数を実行しようとしています。しかし、私はモジュール内の関数への未定義の参照

主なエラーを得続ける:

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の前に書いています。サブルーチンmatfunf1

+0

これは機能しますか? –

答えて

1

は(再)ライン

 integer :: i,j,n,f1 

視界からこの効果マスクモジュール関数で、整数であることが宣言されます。コードはf1を含むモジュールを(正しく)使用しているので、サブルーチン内で宣言してはいけません。

私のコンパイラはfromavgの定義がないと言っていますが、あなたはそれを知っていると思います。

+0

あなたが指摘したようにそれが編集されたように見え、それはだまされたようだ。ちょうど別のエラーを受けましたが、解決策を見つけるためにここに来る前にそれを解決しようとします。ありがとう –

+0

私は通常プログラムでコンテナを使用しません。サブルーチンで 'USE m1'を必要としないようにしますか? – Holmz

+0

それを再度実行し、セグメンテーション障害を取得した後、-fcheck = allエラーを実行しましたが、同じエラーが再び発生するようです –

関連する問題