代码之家  ›  专栏  ›  技术社区  ›  Clint

在调用子例程之前调用项时是否分配了子例程变量?

  •  1
  • Clint  · 技术社区  · 16 年前

    我有代码调用 ENTRY 在一个 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 分配?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Stefano Borini    16 年前

    据我所知,除非在编译过程中有一个特殊的开关,并且这在所有编译器中都不存在(IBMXLF有这个开关,但我不记得了),否则不会对堆栈分配的数据进行初始化。

    这意味着这些数组将充满随机垃圾。

    无论如何,我强烈建议你 使用入口,除非你的生活依赖于它。在您展示它的过程中,我没有看到使用它的真正原因,除非预先设置状态,然后调用入口符号,但是有更好、更干净的选择。

    如果你的意思是分配,那么它肯定是分配的。本代码

      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    $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
    

    正如您所看到的,基本上是相同的(即,条目只是初始化部分的“复制”例程,然后在后面输出),实际分配发生在uuuu95_master_0中。_

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

    当您看到堆栈指针递减时,您可以看到它在两个例程中都被调用。

    当然,如果第一部分包含一个可分配变量和一个allocate,那么事情就会发生变化。在这种情况下,我不能肯定它不会被分配。你会撞车,但那是另一个问题。