Les variables SUBROUTINE sont-elles affectées lors de l’appel d’une entrée avant d’appeler la SUBROUTINE?

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

  •  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é?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top