Les variables SUBROUTINE sont-elles affectées lors de l’appel d’une entrée avant d’appeler la SUBROUTINE?
-
06-07-2019 - |
Question
J'ai un code qui appelle un ENTRY
dans un SUBROUTINE
avant le SUBROUTINE
. Les variables sont-elles allouées?
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
Donc, si je appelle la barre
avant toto
, le IA
est-il alloué?
La solution
Pour autant que je sache, aucune initialisation n’a lieu sur les données allouées à la pile, sauf si vous avez un commutateur spécial lors de la compilation, et cela n’existe pas dans tous les compilateurs (IBM xlf l’a mais ne s’en souvient pas).
Cela signifie que ces tableaux seront pleins d'ordures aléatoires.
Dans tous les cas, je vous suggère fortement de ne pas utiliser ENTRY sauf si votre vie en dépend. Pendant que vous le présentez, je ne vois pas vraiment de raison de l'utiliser, si ce n'est en définissant l'état à l'avance puis en appelant le symbole ENTRY, mais il existe de bien meilleures alternatives plus propres.
Si vous voulez dire alloué, alors c'est le cas. Ce code
program hello
call bar
end
SUBROUTINE foo
character A(12345)
a(1) = "hello"
ENTRY bar
print *, a(1)
RETURN
END
est compilé dans ce code (texte long)
.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
Ce qui, comme vous pouvez le constater, est fondamentalement identique (à savoir, ENTRY ne sont que des routines "copiées" pour la partie d'initialisation, puis se décomposent plus tard) l'allocation réelle est effectuée dans ___ g95_master_0 _
<*>Où vous voyez ce pointeur de pile décrémenté et vous voyez qu'il est appelé dans les deux routines.
Bien sûr, si votre première partie contient une variable ALLOCATABLE et une ALLOCATE, les choses changent. dans ce cas, je ne suis pas sûr qu'il ne soit pas attribué. et vous aurez un crash, mais c'est une autre question.