再帰によるスタックオーバーフロー?(C# と VB.NET の質問掲示板)より:
//再帰処理部分。
private bool checkloop(string grp, string ffiscalyr, int fperiod)
{
int Row;
string wkKOgrp;
//パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1
Row = Find(dtSet, grp, ffiscalyr, fperiod
, 0 ,int.Parse(dtSet.Tables[0].Rows.Count.ToString())-1);
while (Row > -1)
{
wkKOgrp = dtSet.Tables[0].Rows[Row].ItemArray[1].ToString();
//一番おおもとの比較値と比較
if (SerchTarget == wkKOgrp)
{
return true;
}
else
{
//自身を再度呼び出す
if(checkloop(wkKOgrp,ffiscalyr,fperiod) == false)
{
//現在の行数以降で、パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1
Row = Find(dtSet, grp, ffiscalyr, fperiod
, Row + 1, dtSet.Tables[0].Rows.Count - 1);
}
else
{
return true;
}
}
}
return false;
}
//子コードが一致したデータの行数を返す関数
private int Find(DataSet ds, string GRP, string ffiscalyr, int fperiod
, int startrow, int endrow)
{
int i;
for (i = startrow ; i <= endrow ; i++)
{
if ((ds.Tables[0].Rows[i].ItemArray[0].ToString() == GRP)
&& (ds.Tables[0].Rows[i].ItemArray[2].ToString() == ffiscalyr)
&& (int.Parse( ds.Tables[0].Rows[i].ItemArray[3].ToString()) == fperiod))
{
return i;
}
}
return -1;
}
ん。。。呼び出し側に書かれたコメントは、親コードとしてもつ行の行数
。実際の定義に書かれたコメントは、子コードが一致したデータの行数
。
親コードが一致するのか、子コードが一致するのか?
人間、自分が読めるもの、つまり日本語にまず目がいく。すると、呼び出し側と定義側で違うことが書いてある。まず、とまどう。
そうすると、コードを読まないといけない。ここが、本当にしたいことをしているのかわからないから。日本語を読むのと、コードを読むのと。どっちが時間がかかるだろう?あるいは、1行の日本語を読むのと、数行のコードを読むのと、どっちが時間がかかるだろう?
そして、Find メソッドがしていること。
引数 ds の0番目に定義されているテーブルを、startrow 番目(0起点)から検索を初めて、endrow 番目までに、0列が GRP、2列が ffiscalyr、3列が fperiod である行があれば、その行番号を返す。
「行数」を返しているわけではない、と。
コメントに「行数」と書いてあるので、「行の数」が返ると思って「行数」と、「行番号」は、一致しないですよね?
とコメントしたのだけれど、「行番号」を期待して、「行番号」が返っている。コードを、すこ~ししか読んでいなかったので、間違った返信をしてしまった。
質問に対する返信だから、まだいい。私がこのコードを直す役を負っていたら、間違いなく呼び出し側に修正をかけている。そして、バグを作り込み、慌てて元に戻すことになっている。
たま~~~に、メンテナンスされていないコメントを見かけます。メンテしてください。コメントの間違いは、バグに等しいのです。
投稿日時 : 2008年6月6日 23:27