我有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
之前foo
是IA
分配的呢?
我有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
之前foo
是IA
分配的呢?
据我所知,除非你在编译期间有一个特殊的开关,否则不会对堆栈分配的数据进行初始化,而且这在所有编译器中都不存在(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,那么情况就会改变。在那种情况下,我很确定它不会被分配。你会崩溃,但这是另一个问题。