2011-08-12 3 views
0

오늘 저는 AppleScript를 사용하기 시작했으며 서브 루틴에 대해 들어 봤습니다. 그래서 숫자를 취하고 9 씩 증가시키고 27을 뺀 다음 3으로 나눈 다음 결과를 반환하는 작은 테스트 프로그램을 작성하기로 결정했습니다. 결과 만 반환하지 않습니다. 대신 StackOverFlow 오류를 반환합니다. StackOverFlow 오류 란 무엇입니까?AppleScript - StackOverflow 오류

프로그램이 올바르게 컴파일되었는데 무엇이 문제가 있는지 알지 못합니다. 내가 말했듯이, 나는 매우 appleescript에 새입니다.

calculate_result(text returned of (display dialog "Enter a number:" default answer "")) 

on calculate_result(this_result) 
    set this_result to this_result + 9 
    set this_result to this_result - 27 
    set this_result to this_result/3 
    return calculate_result(this_result) 
end calculate_result 
당신은 반복적으로 다시에 this_result을 통과하는 서브 루틴을 차례로 호출 된 함수를 호출

답변

2
return calculate_result(this_result) 

이 서브 루틴 호출 등 : 여기에 내가 실행 해요 코드입니다. 변수, 함수의 주소 반환 등은 스택에 있습니다. 그리고 서브 루틴의 재귀 적 특성으로 인해 스택이 오버플로됩니다.

2

"calculate_result"에서 마지막 행은 "calculate_result"를 다시 호출합니다.

return (this_result)

서브 루틴의 마지막 줄에 그냥 다시 서브 루틴을 호출하고, 다시 서브 루틴을 호출, 다시 서브 루틴을 호출, 다시 서브 루틴을 호출, 서브 루틴을 다시 호출 라인으로 변경 ...

아이디어를 얻은 것 같아요. AppleScript는 작성한대로 충돌이 발생하기 때문에 결국 메모리가 부족하여 스택 오버플로 오류가 발생합니다.

스택 오버플로 오류는 프로그램에서 특정 종류의 메모리 공간이 부족할 때마다 발생합니다. AppleScript에만 국한되지는 않으며 모든 프로그래밍 언어에서 발생할 수 있습니다. 스택 오버플로 오류의보다 자세한 설명이 답변을 참조 수 있습니다 :

(What is a stack overflow?)

3

매개 변수와 지역 변수는 스택에 할당

an answer to a similar question에서 발췌 ... (참조 유형은 힙에 객체가 있고 변수는 그 객체를 참조합니다). 스택은 일반적으로 주소 공간의 상단 끝에 있으며 주소 공간의 맨 아래쪽으로 향하게됩니다 (예 : 0으로 향함).

프로세스에는 프로세스의 맨 아래에있는 힙이 있습니다. 메모리를 할당 할 때이 힙은 주소 공간의 상단으로 갈 수 있습니다. 보시다시피, 힙이 스택과 "충돌"할 가능성이 있습니다 (테크 토닉 플레이트와 비슷합니다 !!!).

스택 오버플로 오류는 스택 (사용자의 서브 루틴)이 오버플로되었음을 나타냅니다 (충돌 한 횟수만큼 자주 실행 됨). 스택 오버플로 오류는 일반적으로 잘못된 재귀 호출 (AppleScript의 경우 잘못된 서브 루틴 호출)으로 인해 발생합니다.

일반적으로 서브 루틴이 값을 반환하면 값이 서브 루틴 이름이 아닌지 확인하십시오. 그렇지 않으면 스택이 오버플로되어 프로그램이 중단됩니다 (return 문이 try 블록 내부에 없으면). 이 변경 :

return calculate_result(this_result) 

...이까지

return this_result 

... 당신은 잘 가야합니다!

경우에 따라 종료 조건이있는 경우에만 서브 루틴 이름을 반환해도됩니다. 사용자가 잘못된 번호를 입력 한 경우, 예를 들어, 서브 루틴 자체를 다시 수행 할 수 있지만, 경우에만 번호가 유효 (아래 참조) 위의 경우

on get_input() 
    set this_number to null 
    try 
     set this_number to the text returned of (display dialog "Please enter a number:" default answer "") as number 
    on error --the user didn't enter a number and the program tried to coerce the result into a number and threw an error, so the program branches here 
     return get_input() 
    end try 
    return this_number 
end get_input 

를 종료 조건이있는 경우에는, 유저가 발생할 실제 숫자를 입력합니다. 종료 조건이 없으므로 프로그램에서 스택 오버플로 오류가 발생할 때 일반적으로 알 수 있습니다.

이 정보가 도움이되기를 바랍니다.

+0

공정하지 않습니다 ... 누군가가 내게 upvoted 다음 멀리 가져가 :( – fireshadow52

+0

+1 균형 :) – Mahesh

+0

+1 모든 대답; 그들은 모두 좋다 :) – fireshadow52