将分配的数组从子例程传递到fortran中的主程序;使用还是模块?接口?

尼诺

我想在子程序中分配一个数组,然后在主程序中使用该数组并将其传递给其他子程序。过去(F77?)传递可以在一个通用块中完成,但如今,最受欢迎的过程似乎是使用模块。当我尝试执行此操作时,如代码示例中所示,编译器告诉我

Rank mismatch in argument ‘f’ at (1) (scalar and rank-1)

显然,主程序认为'f'是一个标量:但是,我读这段代码意味着我已经在子例程内部和主程序中将其声明为一维数组。我想念什么?

我已经尝试了各种变体,例如将变量声明为模块的一部分,但是我想到的一切都没有使编译无错误(并且有些产生了更多的错误;-()。对任何见解都表示赞赏。

          module subs
        contains
        subroutine makef(f)
        end subroutine makef
      end module subs
c-----------------------------------------------------------------------
      program work

      use subs
      implicit none
        real, allocatable :: f(:)

      call makef(f)

      write (*,*) f
      stop
      end
c---------------------------------------------------------------------
      subroutine makef(f)
      implicit none

      real, allocatable, intent(out) :: f(:)
      integer :: i
      integer :: is

      is=10
      allocate(f(-is:is))

      do i=-is,is
        f(i)=i
      end do
      return
      end subroutine makef
法国

Fortran中的模块与其他语言中的头文件不同,后者仅提供有关在其他地方定义的内容的信息。存在“延迟定义”(子模块)的概念,但是在这种情况下,模块应说明有关子例程的所有内容,而不仅仅是尝试指出其存在。

在问题的示例中,我们有:主程序;一个模块subs与模块过程makef; 外部子程序makef

主程序使用模块subs及其程序makef,因此在主程序中引用的makef是该模块程序而不是外部子程序makef

模块子例程makef具有f不带声明语句的参数,从而使其成为隐式声明的标量/外部函数。这是编译器的消息。implicit none在模块中使用,就像在主程序和外部子例程中一样。

子例程的整个定义应放在模块中:

module subs
  implicit none
contains
  subroutine makef(f)
    real, allocatable, intent(out) :: f(:)
    integer :: i
    integer :: is

    is=10
    allocate(f(-is:is))

    do i=-is,is
      f(i)=i
    end do
  end subroutine makef
end module subs

或者,如果确实希望引用外部过程的后续实现,则接口模块可以在模块中使用,而无需声明子例程本身。在这种情况下,仍然有必要指定完整的接口:

module subs
  implicit none

! An interface block to give an explicit interface to the external subroutine makef
  interface
     subroutine makef(f)
       implicit none
       real, allocatable, intent(out) :: f(:)
     end subroutine makef
  end interface
end module subs

在这种情况下,不要使用接口块。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

fortran,将可分配数组传递给具有右边界的子例程

来自分类Dev

如何将单维数组从Fortran传递到C

来自分类Dev

FORTRAN-子例程中的可分配数组

来自分类Dev

Fortran 95-编译时如何自动查找主程序中使用的模块

来自分类Dev

在不阻塞主程序的情况下在FORTRAN中调用子例程

来自分类Dev

Fortran:将任意“结构”传递给模块子例程

来自分类Dev

将二维数组从Fortran传递到C

来自分类Dev

Fortran-在主程序中声明递归函数

来自分类Dev

如何使用pdo将字符串数组传递给php中的plsql例程

来自分类Dev

如何在不使用模块的情况下将我的Fortran例程(及其接口)放入DLL中?

来自分类Dev

如何将动态分配的数组传递给子例程

来自分类Dev

在Fortran 90中的模块内部使用子例程

来自分类Dev

如何在Fortran子例程中使用可分配数组?

来自分类Dev

在tk perl接口中从子例程传递变量

来自分类Dev

如何将参数从子例程传递到VBA中的函数?

来自分类Dev

在Fortran90中,是否可以在主程序中使用文件中的模块?

来自分类Dev

将值从函数传递到子例程

来自分类Dev

在fortran的子例程中更新数组的值

来自分类Dev

在Fortran子例程中分配数组

来自分类Dev

Fortran将数字传递给子例程

来自分类Dev

将2d数组作为1d参数fortran传递给子例程

来自分类Dev

使用自定义模块后,在所需文件中定义的子例程将分配给错误的名称空间

来自分类Dev

由于主程序中的索引重命名,子例程未在假定的形状数组中返回正确的数值

来自分类Dev

如何使用f2py将字符串数组传递给Fortran子例程

来自分类Dev

如何指示子例程,可分配数组使用哪个模块

来自分类Dev

使用ctypes将python字符串传递给Fortran子例程

来自分类Dev

将 JFrame 输出存储到主程序中的字符串中

来自分类Dev

将值从 netty 中的通道处理程序传递给主程序

来自分类Dev

当传递给 Fortran 中的子例程时,数组是否被视为指针?

Related 相关文章

  1. 1

    fortran,将可分配数组传递给具有右边界的子例程

  2. 2

    如何将单维数组从Fortran传递到C

  3. 3

    FORTRAN-子例程中的可分配数组

  4. 4

    Fortran 95-编译时如何自动查找主程序中使用的模块

  5. 5

    在不阻塞主程序的情况下在FORTRAN中调用子例程

  6. 6

    Fortran:将任意“结构”传递给模块子例程

  7. 7

    将二维数组从Fortran传递到C

  8. 8

    Fortran-在主程序中声明递归函数

  9. 9

    如何使用pdo将字符串数组传递给php中的plsql例程

  10. 10

    如何在不使用模块的情况下将我的Fortran例程(及其接口)放入DLL中?

  11. 11

    如何将动态分配的数组传递给子例程

  12. 12

    在Fortran 90中的模块内部使用子例程

  13. 13

    如何在Fortran子例程中使用可分配数组?

  14. 14

    在tk perl接口中从子例程传递变量

  15. 15

    如何将参数从子例程传递到VBA中的函数?

  16. 16

    在Fortran90中,是否可以在主程序中使用文件中的模块?

  17. 17

    将值从函数传递到子例程

  18. 18

    在fortran的子例程中更新数组的值

  19. 19

    在Fortran子例程中分配数组

  20. 20

    Fortran将数字传递给子例程

  21. 21

    将2d数组作为1d参数fortran传递给子例程

  22. 22

    使用自定义模块后,在所需文件中定义的子例程将分配给错误的名称空间

  23. 23

    由于主程序中的索引重命名,子例程未在假定的形状数组中返回正确的数值

  24. 24

    如何使用f2py将字符串数组传递给Fortran子例程

  25. 25

    如何指示子例程,可分配数组使用哪个模块

  26. 26

    使用ctypes将python字符串传递给Fortran子例程

  27. 27

    将 JFrame 输出存储到主程序中的字符串中

  28. 28

    将值从 netty 中的通道处理程序传递给主程序

  29. 29

    当传递给 Fortran 中的子例程时,数组是否被视为指针?

热门标签

归档