2011-08-12 10 views
0

私は今、applescriptの使用を開始しており、サブルーチンについて聞いています。だから私は数値を取り、それを9だけ増やし、27を減算し、3で割り、その結果を返す小さなテストプログラムを書くことに決めました。それだけが結果を返さない。代わりにStackOverFlowエラーを返します。 StackOverFlowエラーとは何ですか?AppleScript - StackOverflowエラー

プログラムが正しくコンパイルされていて、何が間違っているのか分かりません。私が言ったように、私は非常に applescriptに新しいです。

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 

答えて

2
return calculate_result(this_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からの抜粋... (参照型でオブジェクトはヒープ上にあり、変数はそのオブジェクトを参照します)。スタックは、通常、アドレス空間の上端にあり、消費されると、アドレス空間の底に向かう(ゼロに向かう)。

また、プロセスにはヒープがあり、プロセスの最後に存在します。メモリを割り当てると、このヒープはアドレス空間の上端に向かって成長することができます。ご覧のとおり、ヒープがスタックに衝突する可能性があります(techtonicプレートのように!!!)。

スタックオーバーフローエラーは、スタック(サブルーチン)がオーバーフローした(スタックが何度も実行されたためにクラッシュした)ことを意味します。スタックオーバーフローエラーは、通常、不正な再帰呼び出し(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