Visual basic での StackOverflowException
■Visual basic でのオセロ作成(GUI)02。
オセロのプログラムの中で、GUIでユーザ入力した後に相手方はランダムで入力するようにしたけど、その際に StackOverflowException が発生した。エラーの内容は、スタック領域が不足しているためとのこと。
ランダムで置くコードは、8×8のマス上のうちの1マスにランダムに石を置いたことを想定し裏返すことができるかチェックし、置ける場所が見つかったらそこを採用する。GUI上で入力する時よりも処理の量が多くなるため、スタック領域が不足した。
単純にスタック領域を増やして対応しようとしたけど、やり方がよく分からない。ネット上では、/F, STACKオプションを使う記載があるけど、どうもC++など別言語を指しているよう。他にも、mallocでヒープメモリの領域に入れる、別Threadを使うといったやり方があるようだけど、こちらもVisual basicでのやり方がいまいち分からない。
最終的にコード修正で解決。
石を裏返す際に使用している再帰処理の部分で Exception が発生しており、Visual basic では再帰処理はあまりよろしくないみたい。再帰部分を for 文で代用。
下のような簡単な再帰処理でも、(DEBUG実行で)Console.WriteLineの出力が10800くらいのところで StackOverflowException が発生する。
Public Class recClass
Public Function recursionFunc(int As Integer)
Dim tempint As Integer = 1
int = int + tempint
Console.WriteLine(int)
If int > 20000 Then
Else
int = recursionFunc(int)
End If
Return int
End Function
End Class
診断ツールとか使ってスタック領域の使用量とか分からないものかなー。上のコードはボタンで実行するけど、プログラム起動時(1, 2)、コード実行して Exception が出た後(3, 4)の診断ツールの結果が下。そんなにサイズが増えているわけではないので、ここからは分からないよう。スタック領域は1MB(1000 KB)らしいけど、増えているのは4.16 KB。
オセロのプログラムは、もう少しデザインをいじって終わりかな。