Распределяются ли переменные SUBROUTINE при вызове ENTRY перед вызовом SUBROUTINE

StackOverflow https://stackoverflow.com/questions/1020464

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня есть код, который вызывает 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 ?

Это было полезно?

Решение

Насколько я знаю, инициализация стека, выделенных для данных, не происходит, если у вас нет специального переключателя во время компиляции, и он существует не во всех компиляторах (он есть у 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    
___g95_master_0__:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ebx
    subl    $12372, %esp
    call    L8
, -8(%ebp) movl $1, -4(%ebp) subl $4, %esp pushl <*> 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 <*>, -8(%ebp) movl <*>, -4(%ebp) subl $4, %esp pushl <*> 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 _

<*>

Где вы видите, что указатель стека уменьшен, и вы можете видеть, что он вызывается в обеих подпрограммах.

Конечно, если ваша первая часть содержит переменную ALLOCATABLE и ALLOCATE, то все изменится. в этом случае я уверен, что он не будет выделен. и у вас будет сбой, но это другой вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top