我需要在子程序中为一个相当复杂的结构(这里用“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():错误类型
任何帮助都将受到高度赞赏。
答案 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
然后在你的主程序中有一些莫名其妙的事情。为什么i
和j
被声明为整数?当然它们必须指向真实数组,如果打算将它们传递给你的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
这更接近你期望的输出吗?