tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 組み合わせ合計検索 つづき
投稿日: 2023/08/14(Mon) 23:36
投稿者魔界の仮面弁士
> 組み合わせ合計検索
> サンプル 23/02/12 10:52 No.12102 についてです。
これですね。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=12102&reno=12091&oya=12091&mode=msgview&page=0

今でも VB2010 (.NET Framework 4) のままなのでしょうか?



> ↓こちらでエラーでます。
>  If values.Any(Function(v) v <= 0) Then Throw New ArgumentOutOfRangeException("values", "自然数が必要です。")

ということは、values 配列の中に「0 またはそれ以下の値」が混入していたということに他なりません。
渡した配列の中身が、すべて 1 以上の自然数であることを確認していますか?

以前の質問では、
>> 値はすべて自然数ですか? それとも負の整数なども含まれますか?
> 自然数のみです。
というやりとりがあったはずです。今回の要件も同じと考えて良いのでしょうか?
「0」や「-1」は自然数ではありませんので、負数が混入した時は範囲外エラーとして扱っているわけです。


> 以下のように代入しまして
唐突に DataGridView が出てきましたが、何行何列の構成になっていて、
どういうデータが入っているのか分からないので、第三者が検証しにくいです。

コードの意図も不明瞭な上に、どのようなデータが渡されているのかも分からない状況ゆえ、
間違いを指摘する以前の問題として、そもそも何がやりたいのかさえ把握できないです。



> Dim sDATA() As Integer  
> ReDim sDATA(100)
なぜこんな面倒な書き方を…?
VBA ではあるまいし、要素数が 101 個の配列を確保したいだけならば、
素直に「Dim sDATA(100) As Integer」だけで良いような。

というか 101 個固定で良いのですか?
そしてその 101 個の値は、すべてが(0 ではなく)自然数のみの一覧になっていることを保証できていますか?

個数が未定ならば配列なんて使わずに、Dim sDATA As New List(Of Integer)() あたりにしておき、
 sDATA(番号) = 新しい値
の代わりに
 sDATA.Add( 新しい値 )
の形で登録するようにすれば、要素数を可変にできます。これなら、変数 cnt の管理も不要になるかと。


> 探索(590, sDATA) を実行すると
ひとまず、ここまでに書かれていた DataGridView 云々の部分は、
質問の本題に対しては、何の意味も無いようです。


エラーの理由を特定したいのであれば、エラーに至ったこの時点における
変数 sDATA の中身がどうなっていたのかを、具体的に示してもらった方が手っ取り早いです。

(1) DataGridView の情報に問題があって、sDATA の中身が想定外になっているのか?
(2) DataGridView のデータは正しいけれど、それを sDATA に詰める処理に手順ミスがあるのか?
(3) sDATA の中身は正しいけれど、「探索」処理が期待動作してくれていないのか?

そういった点を調査できるのは、実際にデータを保有している貴方自身だけです。



結局のところ、最初に実施すべき作業は「調査」です。
sDATA の中身が想定と違っていたからエラーになったのか、それとも、
sDATA の中身は想定通りだったけれど、探索処理に問題があってエラーになったのかを調べましょう。

プログラムを修正するのは、そうした調査による現状把握が終わってからの話です。
原因を突き止めてからでなければ、修正のしようがありませんからね。


=== 以下蛇足 ===

> Dim cnt As Integer
> cnt = 0
2 行に分ける意味が無いので、「Dim cnt = 0」で十分かと。


> For i As Integer = 0 To DataGridView1.Rows.Count - 1
>  sDATA(cnt) = Me.DataGridView1(1, i).Value
このコードを見る限り、「Option Strict On」設定ではないようですね。

左辺の sDATA(cnt) は Integer 型で、右辺の Value プロパティは Object 型です。
代入式の左右で、データ型が一致していません。


>  If Me.DataGridView1(6, i).Value <> "" Then
>   Data2 = Me.DataGridView1(6, i).Value
今度は、比較式の左辺が Object 型で、右辺が String 型な点に違和感があります。

データ型を常に意識しましょう。
また、変数 Data2 が唐突に現れましたが、これがどんな型の変数なのか示されていません。

たとえば Integer 型への変換を必要としているなら、Integer.TryParse メソッドの利用を検討してください。
これならば、入力値を整数型に変換できるかどうかの検査も一緒に行うことができます。
https://hiros-dot.net/VBNET2005/String/String14.htm
第一引数に文字列、第二引数に Integer 型変数を渡します。
戻り値は、変換成功なら True、変換失敗なら False となります。


>  For ii As Integer = 0 To Data2 - 2
>   sDATA(cnt) = Me.DataGridView1(1, i).Value
>   cnt = cnt + 1
>  Next ii
ここも、もう少し整理できそう。
ループ内で変数 i は変化しないのに、毎回、セルを参照し続けるのはあまり効率が良くないです。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。