我的代码在ENTRY
之前调用SUBROUTINE
中的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
分配了吗?
答案 0 :(得分:1)
据我所知,除非你在编译期间有一个特殊的开关,否则不会对堆栈分配的数据进行初始化,并且这在所有编译器中都不存在(IBM xlf有,但我不记得)。
这意味着那些数组将充满随机垃圾。
无论如何,我强烈建议你不使用ENTRY,除非你的生活取决于它。正如你所呈现的那样,我并没有真正看到使用它的理由,除了事先设置状态然后调用ENTRY符号,但有更好,更清洁的替代品。
如果你的意思是分配,那肯定会。这段代码
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
你可以看到的基本相同(即,ENTRY只是初始化部分的“复制”例程,然后再分出)实际分配发生在___ g95_master_0 _
___g95_master_0__:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12372, %esp
call L8
你看到堆栈指针递减,你可以看到它在两个例程中被调用。
当然,如果您的第一部分包含ALLOCATABLE变量和ALLOCATE,那么事情会发生变化。在那种情况下,我很清楚它不会被分配。你会崩溃,但这是另一个问题。