서브 루틴을 호출하기 전에 항목을 호출 할 때 서브 루틴 변수가 할당됩니다.

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

  •  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

스택 포인터가 줄어들고 두 루틴 모두에서 호출되는 것을 볼 수 있습니다.

물론, 첫 번째 부분에 할당 가능한 변수와 할당이 포함되어 있으면 상황이 바뀝니다. 이 경우, 나는 그것이 할당되지 않을 것이라고 확신합니다. 그리고 당신은 충돌이있을 것이지만 그것은 또 다른 질문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top