Fortran公共变量,可分配数组

时间:2013-04-12 06:25:00

标签: arrays fortran

是否可以在子程序中分配公共数组的大小和值,然后从程序的其他子程序中使用它?

以下程序不起作用,但我想做这样的事情:

main.f

program main

integer n
integer, allocatable :: co(:)

common n, co

call assign

print *, co(1), co(2)

deallocate(co)
stop
end program main

assign.f

subroutine assign

integer n
integer, allocatable :: co(:)

common n, co

n = 2
allocate(co(n))

co(1) = 1
co(2) = 2

return
end subroutine assign

1 个答案:

答案 0 :(得分:5)

没有。您可以将指针放入常用,但不能分配。

原因在于,共同的基本概念是存储关联,您可以在其中创建所有共同事物的连续序列,然后这些序列在范围之间共享。 Allocatables的大小可以在一个范围内动态变化,这将使得在可分配之后的公共块中的事物序列中的跟踪相当困难。

(可分配的典型实现意味着与allocatable直接关联的存储只是一个描述符 - 实际数据保存在其他地方。这实际上打破了连续的存储单元序列的概念,假设分配状态(如记录的那样)在描述符中)和数据都是可分配值的一部分。指针的实现是类似的,但从概念上讲,内存中其他地方的数据不是指针值的一部分,所以不应该预期出现在公共描述的连续序列中 - 指针在序列中,但不在它指向的位置。)

Allocatables需要F90。这意味着您可以使用模块变量 - 这是比使用常用数据更好的解决方案。如果必须使用common执行此操作,请使用数据指针。