nmtysh.log

Tech系のネタや日々の独り言などを書いています。

HSP:再帰処理

C言語Java言語など一般的にサブディレクトリも処理するような場合には、再帰処理が有効です。

 

しかし、HSPでモジュールを使用して、再帰処理を行うと問題が起こります。

何が問題かというと、パラメータ以外の変数が内部で呼び出した自分自身によって上書きされます。

HSPで使用する変数は、通常、静的な変数、つまりグローバル変数となります。

 

#deffunc abc int a

if a = -1:return 0

b = a

abc a-1

return b + stat

 

わかりにくいサンプルですね。。。

 

 

つまり、最初に abc 5 と呼び出すとC言語などで変数bは、

 深さ

 1 2 3 4 5 6

 ------------

 5

 5 4

 5 4 3

 5 4 3 2

 5 4 3 2 1

 5 4 3 2 1 0

戻り値は15

となります(それぞれ独立している)。

 

ところが、HSPだと

 深さ

 1 2 3 4 5 6

 ------------

 5

 4 4

 3 3 3

 2 2 2 2

 1 1 1 1 1

 0 0 0 0 0 0

戻り値は0

となってしまいます(bは呼び出した関数で上書きされてしまう)。

 

変数の上書きを回避するために

#deffuncに"local 変数名"を付けて変数をローカル変数として宣言します。

 

#deffunc abc int a, local b

 

これで、変数bはローカル変数となり、上書きされずにすみます。

 

ただ、関数の実行時と、終了時に変数の生成/初期化、破棄の作業が行われるためオーバーヘッドが生じます。

そのため、なんでもかんでもローカル変数にするのではなく、必要最低限の物だけローカル変数にすると良いでしょう。

 

説明があんまりよくありませんね。伝わりにくいかもしれません。