2009-06-19 31 views
1

我有一個代碼在SUBROUTINE之前的SUBROUTINE中調用ENTRY。變量是否分配?在調用子例程前調用一個ENTRY時分配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 

所以,如果fooCALL bar之前IA分配呢?

+0

P.S.我不寫這個!我正在將它翻譯成現代代碼。 – Clint 2009-06-19 23:39:31

+0

我感到你的痛苦;) – 2009-06-19 23:48:23

回答

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,那麼情況就會改變。在這種情況下,我很確定它不會被分配。你會有一個崩潰,但這是另一個問題。

相關問題