アカウント名:
パスワード:
今のソースコードは、ゲームを進めていくと突然ゲームが落ちるバグがあります。
原因は Main() の内部で Main() を呼び出しているからです。ある関数Xの内部から関数X自身を呼び出す方法を「再帰呼び出し」といいますが再帰呼び出しが出来る回数には上限があります
たとえば
static int count = 0;static void Main(){ count++; Console.WriteLine("count: {0}", count); Main();}
これを実行するとプログラムがクラッシュします多分デフォルトのC#環境なら count の値が10000ぐらいになると落ちると思います(手元にC#環境が無いので具体的な数値はわかりません)
そしてプログラムが複雑になるとより早くクラッシュするようになります。手元にC#環境が無いので実際にどうなるかは試していませんが多分
static int count = 0;static void Main(){ string txt = Resources.yume_1; string[] bodyText = txt.Split("\r\n");
count++; Console.WriteLine("count: {0} {1}", count, bodyText[0]); Main();}
を実行したら、より早くプログラムが落ちるはずです。
大規模なプログラムなら Mainを数回再帰呼び出しするだけでクラッシュすることもありえます。そのため、一般に Main()を再帰呼び出しすることは禁じ手と考えたほうが良いです。
末尾呼び出しや末尾再帰は、処理系によっては最適化されて、ただのジャンプやループに変換されるから、必ずしもスタックオーバーフローが起きるわけではない。C#の場合はx64でリリースビルドなら末尾最適化があるらしい。gcc(C++)だったら、末尾呼び出しの最適化があったので、それを利用したプログラムを作ったことはある。
まあ、使える条件がかなり限定的なので、普通は使わないほうが良いと思うが、使える場合はコードがシンプルになり、実行速度も速い。
再帰はまあ使えばいいと思う。メイン関数を再帰呼び出しするのはやめたほうがいいと思う。単純に紛らわしいしいわゆる初期化処理を何度も実行するはめになる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ見習い
一つバグがある (スコア:0)
今のソースコードは、ゲームを進めていくと突然ゲームが落ちるバグがあります。
原因は Main() の内部で Main() を呼び出しているからです。
ある関数Xの内部から関数X自身を呼び出す方法を「再帰呼び出し」といいますが
再帰呼び出しが出来る回数には上限があります
たとえば
static int count = 0;
static void Main()
{
count++;
Console.WriteLine("count: {0}", count);
Main();
}
これを実行するとプログラムがクラッシュします
多分デフォルトのC#環境なら count の値が10000ぐらいになると落ちると思います
(手元にC#環境が無いので具体的な数値はわかりません)
そしてプログラムが複雑になるとより早くクラッシュするようになります。
手元にC#環境が無いので実際にどうなるかは試していませんが多分
static int count = 0;
static void Main()
{
string txt = Resources.yume_1;
string[] bodyText = txt.Split("\r\n");
count++;
Console.WriteLine("count: {0} {1}", count, bodyText[0]);
Main();
}
を実行したら、より早くプログラムが落ちるはずです。
大規模なプログラムなら Mainを数回再帰呼び出しするだけでクラッシュすることもありえます。
そのため、一般に Main()を再帰呼び出しすることは禁じ手と考えたほうが良いです。
Re: (スコア:0)
末尾呼び出しや末尾再帰は、処理系によっては最適化されて、ただのジャンプやループに変換されるから、必ずしもスタックオーバーフローが起きるわけではない。C#の場合はx64でリリースビルドなら末尾最適化があるらしい。gcc(C++)だったら、末尾呼び出しの最適化があったので、それを利用したプログラムを作ったことはある。
まあ、使える条件がかなり限定的なので、普通は使わないほうが良いと思うが、使える場合はコードがシンプルになり、実行速度も速い。
Re: (スコア:0)
再帰はまあ使えばいいと思う。メイン関数を再帰呼び出しするのはやめたほうがいいと思う。
単純に紛らわしいしいわゆる初期化処理を何度も実行するはめになる。