1

ENTRYSUBROUTINE前にを呼び出すコードがあります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

それで、私がCALL barfooIA割り当てられたら?

4

1 に答える 1

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 が含まれている場合は、状況が変わります。その場合、私はそれが割り当てられないことを確信しています。クラッシュしますが、それは別の問題です。

于 2009-06-19T23:33:39.893 に答える