2

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

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

主文件

program main

integer n
integer, allocatable :: co(:)

common n, co

call assign

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

deallocate(co)
stop
end program main

赋值.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
4

1 回答 1

4

不可以。您可以将指针放入公共对象,但不能放入可分配对象。

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

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

可分配项需要 F90。这意味着您可以使用模块变量——这是一个比对全局数据使用 common 更好的解决方案。如果必须使用 common 执行此操作,请使用数据指针。

于 2013-04-12T06:53:51.213 回答