São variáveis ??SUBROUTINE alocados ao chamar uma entrada antes de chamar a sub-rotina

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho o código que chama um ENTRY em um SUBROUTINE antes do SUBROUTINE. São as variáveis ??alocados?

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

Então, se eu CALL bar antes foo é IA alocados?

Foi útil?

Solução

Tanto quanto eu sei, nenhuma inicialização ocorre em dados pilha alocada a menos que tenha um interruptor especial durante a compilação, e isso não é existente em todos os compiladores (IBM XLF tem isso, mas eu não me lembro).

Isso significa que essas matrizes será cheio de lixo aleatório.

Em qualquer caso, eu sugiro fortemente que você não usar a entrada, a menos que sua vida depende disso. Como você está apresentando, eu realmente não vejo uma razão para usá-lo, exceto a configuração do estado de antemão e, em seguida, chamando o símbolo de entrada, mas há muito melhor, alternativas mais limpas.

Se você quer dizer alocados, então ele definitivamente faz. Este código

  program hello
  call bar
  end
  SUBROUTINE foo
  character A(12345)
  a(1) = "hello"
  ENTRY bar
  print *, a(1)
  RETURN
  END

é compilado para este código (coisas de comprimento)

.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

Que, como você pode ver é basicamente o mesmo (ou seja, de entrada são apenas "copiado" rotinas para a parte de inicialização, e depois desembolsar mais tarde) a alocação real acontece em ___ g95_master_0 _

___g95_master_0__:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ebx
    subl    $12372, %esp
    call    L8

Onde você vê que stack pointer diminuído, e você pode vê-lo é chamado em ambas as rotinas.

Claro que, se a primeira parte contém uma variável ALLOCATABLE e um ALLOCATE, então as coisas mudam. nesse caso, estou faily certeza que não vai ficar alocado. e você terá um acidente, mas isso é outra questão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top