Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 调用函数或子例程_Fortran_Gfortran - Fatal编程技术网

Fortran 调用函数或子例程

Fortran 调用函数或子例程,fortran,gfortran,Fortran,Gfortran,我是fortran新手,我试图执行一个函数/子例程,但我得到了一个所需的错误显式接口 这是我的代码: function printmat(m) integer, dimension(:,:) :: m integer :: row,col row = size(m,1) col = size(m,2) do k=1,row print *, m(k,1:col) enddo end function printm

我是fortran新手,我试图执行一个函数/子例程,但我得到了一个所需的错误显式接口

这是我的代码:

function printmat(m)
    integer, dimension(:,:) :: m
    integer :: row,col
    row = size(m,1)
    col = size(m,2)
       do k=1,row
            print *, m(k,1:col)
       enddo
end function printmat

program test
    integer, dimension(5, 5) :: mat
    integer :: i,j
    do i=1,5
    do j=1,5
           mat(j,i) = real(i)/real(j)
    enddo
    enddo
    call printmat(mat)
end program test
但当我执行它时,我得到:

Error: Explicit interface required for 'printmat' at (1): assumed-shape argument

知道会是什么吗?我尝试将其包装到一个模块中,但当我在程序中使用use modulename时,它会给我一个错误尝试从具有相同名称的文件中读取它

将其包装到一个模块中,并使其成为一个子例程(如果您想在调用中使用它)

或者,您可以按照编译器的指示执行,并向程序添加一个显式接口


看起来你没有读我文章的最后一部分,我已经试过了,上面写着“致命错误:无法打开模块文件'printmat_module.mod'以便在1:No这样的文件或目录下阅读”。我使用的是gfortran,可能与此有关,我不知道。@Ghost如果我将上述代码保存为test.f90并使用gfortran test.f90编译,它就可以正常工作。@Ghost我添加了第二个没有模块的部分。@Ghost你能编辑你的问题,告诉我们你使用什么命令来编译带模块的程序吗,以及源代码存储在reat中的文件-但是请注意,您应该使用第一种解决方案,尽量避免在任何地方和任何时候编写显式接口。您确实理解为什么在这种情况下需要一个接口吗?如果在将错误包装到模块中后遇到问题,请说明该尝试,以及如何编译它。就这个问题而言,您似乎知道您可以解决与模块的显式接口的需求,因此我不清楚您的问题是什么。
module printmat_module
contains
  subroutine printmat(m)
    integer, dimension(:,:) :: m
    integer :: row,col
    row = size(m,1)
    col = size(m,2)
    do k=1,row
       print *, m(k,1:col)
    enddo
  end subroutine printmat
end module printmat_module

program test
  use printmat_module
  integer, dimension(5, 5) :: mat
  integer :: i,j
  do i=1,5
     do j=1,5
        mat(j,i) = real(i)/real(j)
     enddo
  enddo
  call printmat(mat)
end program test
subroutine printmat(m)
  integer, dimension(:,:) :: m
  integer :: row,col
  row = size(m,1)
  col = size(m,2)
  do k=1,row
     print *, m(k,1:col)
  enddo
end subroutine printmat

program test
  interface
     subroutine printmat(m)
       integer, dimension(:,:) :: m
     end subroutine printmat
  end interface
  integer, dimension(5, 5) :: mat
  integer :: i,j
  do i=1,5
     do j=1,5
        mat(j,i) = real(i)/real(j)
     enddo
  enddo
  call printmat(mat)
end program test