Распределяются ли переменные SUBROUTINE при вызове ENTRY перед вызовом SUBROUTINE - PullRequest
1 голос
/ 20 июня 2009

У меня есть код, который вызывает ENTRY в SUBROUTINE перед 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 bar до foo выделен IA?

1 Ответ

1 голос
/ 20 июня 2009

Насколько я знаю, при распределении данных в стеке инициализация не происходит, если у вас нет специального переключателя во время компиляции, и он существует не во всех компиляторах (у 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, то все изменится. в этом случае я уверен, что он не будет выделен. и у вас будет сбой, но это другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...