São variáveis ??SUBROUTINE alocados ao chamar uma entrada antes de chamar a sub-rotina
-
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?
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.