- ベストアンサー
自分を呼び出すプログラムの書き方
- フォルダ検索のように計算式1=計算式2+値1 計算式2=値2+値3+値4 ・・・ となるデータの計算結果を算出する方法を教えてください。
- DBから計算式1を検索すると計算式2と値1のキーが取れます。すべての値について配列にしたいのですが、途中で前にセットした値が書き換えられてしまいます。どうしたらよいでしょうか。
- 自分を呼び出すプログラムの書き方について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
やはりざっと読んだだけでは的外れな回答しか出来ませんね・・・。反省。。。 コードを読み直してみたら、ここかな?と思う箇所を見つけたので懲りずに回答出します。 BBBBの一部を抜粋します。 ' 質問では Dim keisandata As New keisan となっていますがaddkeisandataの書き間違えとして見てよいですか? Dim addkeisandata As New keisan … For Each Row As DataRow In dtCV.Rows … addkeisandata.iCalcVId = Row("計算値ID") … keisandata.Add(addkeisandata) Next この状態でループをまわすと、addkeisandataは「ひとつのインスタンス」を何度も使いまわすことになります。つまり、For Eachが回るたびに「同じインスタンスへ新しい値が設定」されてしまいます。結果、コレクションには同じインスタンスが並びます。 変数自体は使いまわし可能ですので、For Eachが回るたびにインスタンスを作成してみてください。 Dim addkeisandata As keisan … For Each Row As DataRow In dtCV.Rows addkeisandata = New keisan ' ここでインスタンスを生成 … addkeisandata.iCalcVId = Row("計算値ID") … keisandata.Add(addkeisandata) Next もうひとつ、BBBBの引数ですが、ByRefで受け取る必要はないと思います。クラスであればByValで受け取ってもインスタンスを引き継ぎます。iCalcIdもBBBB内での変更を呼び出し元に返す必要がなければByValにしておいたほうが安全です。
その他の回答 (1)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
コードはざっと読んだだけですが再帰(リカーシブ)で各計算式を計算させればよいと思います。ひとつのメソッドの中で繰り返し処理を行おうとすれば、当然データは書き換えられてしまいます。 まず、ひとつの式を計算するメソッド(例:Calc)を用意。 Calcは計算式からひとつの解を戻り値として返すとします。 Calcの中で別の式から解を得る必要(計算式の項が別の計算式を参照している場合)があれば、Calcを再帰呼び出し。 Function Calc(計算式のキー) As Integer ' 計算式のキーから、算術項を取得(複数あり) ' 算術項を順番に計算するループ For ... ' もし、算術項に別の計算式があれば再帰 Dim answer As Integer = Calc(別の計算式) Next ... Return (計算式のキーから得られた解) End Function 注意点は、再帰処理している中で計算中の計算式が出てきた場合に無限ループに突入してしまうこと。理論上は有り得ないと思いますが、データ上は有り得てしまうので、処理中の計算式をどこかに一覧で管理する必要があるかもしれません。 X = Y + 1 Y = X - 1 この連立方程式は(解が出せないという意味で)成り立ちませんが、データとして存在することは可能です。
補足
計算はせずに計算で使う式を1つのディクショナリに まとめています。 計算式が計算式を含んでいたとき その計算式を探すためBBBBを呼び出します。 ディクショナリに追加した後 戻ってきておおもとの計算式を配列に追加すると 再帰したときの値が壊れてしまうみたいです。 BBBBのでBBBBを呼ぶ時の引数に 追加したディクショナリを投げるのが おかしいのかとも思っています。
お礼
本当にありがとうございます。 何がわからないかもわからないくらい 困っていたので本当に質問が意味不明でした。 教えて頂いた内容を元に プログラムを見直してみます。