私が知る限り、コンパイル時に特別なスイッチがなければ、スタック割り当てのデータは初期化されません。これはすべてのコンパイラには存在しません(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が含まれていると、物事が変わります。その場合、私はそれが割り当てられないことを確信しています。あなたはクラッシュするでしょうが、それは別の質問です。
P.S.私はこれを書いていないよ!私はそれを現代のコードに翻訳しています。 – Clint
私はあなたの痛みを感じる;) –