私の知る限り、コンパイル中に特別なスイッチを使用しない限り、スタックに割り当てられたデータで初期化は行われず、これはすべてのコンパイラに存在するわけではありません (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 が含まれている場合は、状況が変わります。その場合、私はそれが割り当てられないことを確信しています。クラッシュしますが、それは別の問題です。