1

我有ENTRYSUBROUTINE. SUBROUTINE变量是否分配?

SUBROUTINE foo
character*5 A,B,C
DIMENSION IA(50),IB(50)
print* A,B,C
RETURN
ENTRY bar
DO 50 I=1,50
TOTAL = TOTAL + IA(I)
50 CONTINUE
print* TOTAL
RETURN
END

那么如果我CALL bar之前fooIA分配的呢?

4

1 回答 1

1

据我所知,除非你在编译期间有一个特殊的开关,否则不会对堆栈分配的数据进行初始化,而且这在所有编译器中都不存在(IBM xlf 有它,但我不记得了)。

这意味着这些数组将充满随机垃圾。

无论如何,我强烈建议你不要使用 ENTRY,除非你的生活依赖它。正如您所展示的那样,除了预先设置状态然后调用 ENTRY 符号之外,我真的看不出使用它的理由,但是有更好、更清洁的替代方案。

如果你的意思是分配,那么它肯定是。这段代码

  program hello
  call bar
  end
  SUBROUTINE foo
  character A(12345)
  a(1) = "hello"
  ENTRY bar
  print *, a(1)
  RETURN
  END

被编译成这个代码(长的东西)

.globl _bar_
_bar_:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $0, -8(%ebp)
    movl    $1, -4(%ebp)
    subl    $4, %esp
    pushl   $0
    leal    -12(%ebp), %eax
    pushl   %eax
    leal    -4(%ebp), %eax
    pushl   %eax
    call    ___g95_master_0__
    addl    $16, %esp
    movl    %eax, -8(%ebp)
    movl    -8(%ebp), %eax
    leave
    ret
.globl _foo_
_foo_:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $0, -8(%ebp)
    movl    $0, -4(%ebp)
    subl    $4, %esp
    pushl   $0
    leal    -12(%ebp), %eax
    pushl   %eax
    leal    -4(%ebp), %eax
    pushl   %eax
    call    ___g95_master_0__
    addl    $16, %esp
    movl    %eax, -8(%ebp)
    movl    -8(%ebp), %eax
    leave
    ret

如您所见,基本相同(即,ENTRY 只是初始化部分的“复制”例程,然后再分叉)实际分配发生在 ___g95_master_0_

___g95_master_0__:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ebx
    subl    $12372, %esp
    call    L8

您看到堆栈指针递减的地方,您可以看到它在两个例程中都被调用。

当然,如果您的第一部分包含一个 ALLOCATABLE 变量和一个 ALLOCATE,那么情况就会改变。在那种情况下,我很确定它不会被分配。你会崩溃,但这是另一个问题。

于 2009-06-19T23:33:39.893 回答