如何在FORTRAN例程中为结构/数组创建句柄?

时间:2011-08-07 05:31:12

标签: pointers fortran handler

我需要在子程序中为一个相当复杂的结构(这里用“real a(2)”替换)创建一个句柄,然后只将句柄/指针传回主程序。我还需要能够创建所需的这些结构。 问题是一旦指针返回main,数据结构将被释放。这是我的尝试:

  program main
  implicit none

  integer i, j
  real a(2) ! This can be a complicated structure

  a=(/1.1,2.2/)
  call myalloc(a,i)

  a=(/3.1,4.2/)
  call myalloc(a,j)

  call myprint(i)      
  call myprint(j)

  stop
  end

ç-----------------------------------

  subroutine myalloc(a,i)
  implicit none

  real, pointer :: i(:) ! If I add "save" attribute I will get an error
  real, target :: a(2)

  allocate(i(2))
  i => a

  return
  end 

ç--------------------------------

  subroutine myprint (i)
  implicit none

  real, pointer :: i(:)

  print *, i

  return
  end

ç---------------------------------

结果是一些垃圾值: 3.93764868E-43 1.40129846E-45

或者我会得到: 在文件test.f的第41行(unit = 6,file ='stdout') 内部错误:list_formatted_write():错误类型

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

这段代码有很多错误,建设性地回答几乎太难了。

如果我理解你要做什么,子程序myalloc应该像一个类的复制构造函数 - 将内存分配给提供的指针,然后将初始化参数的内容复制到分配的内存中。因此myalloc中的关键错误是这两行:

  allocate(i(2))
  i => a

这里首先为指针i分配内存,然后指定i指向a。在这种情况下,为什么要分配i?我认为这更接近你想要做的事情:

subroutine myalloc(a,b,n)
  implicit none

  real, dimension(n) :: a
  real, pointer,dimension(:) :: b
  integer :: n

  allocate(b(n))
  b = a ! This copies the contents of the array a to the allocation for b

  return
end 

然后在你的主程序中有一些莫名其妙的事情。为什么ij被声明为整数?当然它们必须指向真实数组,如果打算将它们传递给你的myalloc,对它们执行分配/复制操作,然后打印它们?如果是这种情况,那么将主要内容更改为类似内容应该更接近您正在尝试的内容:

program main
    implicit none

    interface
        subroutine myalloc(a,b,n)
        real,dimension(n) :: a
        real,pointer,dimension(:) :: b 
        integer :: n
        end subroutine myalloc

        subroutine myprint(i)
        real,pointer,dimension(:) :: i
        end subroutine myprint
    end interface

    real,pointer,dimension(:) :: i, j
    real :: a(2)

    a=(/1.1,2.2/)
    call myalloc(a,i,2)

    a=(/3.1,4.2/)
    call myalloc(a,j,2)

    call myprint(i)
    call myprint(j)

    stop
end

通过这些更改,您应该在运行时获得此信息:

$ ./pointer
   1.100000       2.200000    
   3.100000       4.200000    

这更接近你期望的输出吗?