2009-06-19 2 views
1

SUBROUTINEの前にSUBROUTINEENTRYを呼び出すコードがあります。変数は割り当てられていますか?だから、SUBROUTINE変数は、SUBROUTINEを呼び出す前にENTRYを呼び出すときに割り当てられます

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 

I fooCALL barIAを割り当てられている場合はどうなりますか?

+0

P.S.私はこれを書いていないよ!私はそれを現代のコードに翻訳しています。 – Clint

+0

私はあなたの痛みを感じる;) –

答えて

1

私が知る限り、コンパイル時に特別なスイッチがなければ、スタック割り当てのデータは初期化されません。これはすべてのコンパイラには存在しません(IBM xlfはありますが覚えていません)。

これは、これらの配列がランダムなゴミでいっぱいになることを意味します。

いずれにしても、あなたの人生がそれによって決まらない限り、ではありません。あなたがそれを提示しているとき、私は実際に状態を設定して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が含まれていると、物事が変わります。その場合、私はそれが割り当てられないことを確信しています。あなたはクラッシュするでしょうが、それは別の質問です。

+0

悪い用語を残して申し訳ありません。私は割り当てられたことを意味する。最初のコードを実行していなくても、それらの参照は有効ですか? – Clint

関連する問題