在调用SUBROUTINE之前调用ENTRY时是否分配了SUBROUTINE变量

时间:2009-06-19 23:30:23

标签: fortran

我的代码在ENTRY之前调用SUBROUTINE中的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分配了吗?

1 个答案:

答案 0 :(得分: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,那么事情会发生变化。在那种情况下,我很清楚它不会被分配。你会崩溃,但这是另一个问题。