據我所知,堆棧分配的數據不會進行初始化,除非在編譯過程中有特殊的開關,並且這在所有編譯器中都不存在(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,那麼情況就會改變。在這種情況下,我很確定它不會被分配。你會有一個崩潰,但這是另一個問題。
P.S.我不寫這個!我正在將它翻譯成現代代碼。 – Clint 2009-06-19 23:39:31
我感到你的痛苦;) – 2009-06-19 23:48:23