서브 루틴을 호출하기 전에 항목을 호출 할 때 서브 루틴 변수가 할당됩니다.
-
06-07-2019 - |
문제
an을 호출하는 코드가 있습니다 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
할당 되었습니까?
해결책
내가 아는 한, 컴파일 중에 특수 스위치가 없으면 스택 할당 데이터에 대한 초기화가 발생하지 않으며 모든 컴파일러에 존재하지는 않습니다 (IBM XLF는 그것을 가지고 있지만 기억하지 못합니다).
즉, 그 배열은 임의의 쓰레기로 가득 차 있음을 의미합니다.
어쨌든 나는 당신을 강력하게 제안합니다 ~ 아니다 당신의 삶이 그것에 의존하지 않는 한 입장을 사용합니다. 당신이 그것을 발표 할 때, 나는 주를 미리 설정 한 다음 항목 기호를 호출하는 것을 제외하고는 그것을 사용할 이유가 없지만 훨씬 더 깨끗한 대안이 있습니다.
당신이 할당 된 것을 의미한다면, 그것은 확실히 그렇습니다. 이 코드
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
당신이 볼 수 있듯이 기본적으로 동일합니다 (즉, 입력은 초기화 부분에 대한 "복사 된"루틴 일뿐입니다. 그리고 나중에 나중에 포크) 실제 할당은 ___g95_master_0_에서 발생합니다.
___g95_master_0__:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12372, %esp
call L8
스택 포인터가 줄어들고 두 루틴 모두에서 호출되는 것을 볼 수 있습니다.
물론, 첫 번째 부분에 할당 가능한 변수와 할당이 포함되어 있으면 상황이 바뀝니다. 이 경우, 나는 그것이 할당되지 않을 것이라고 확신합니다. 그리고 당신은 충돌이있을 것이지만 그것은 또 다른 질문입니다.
제휴하지 않습니다 StackOverflow