みなさんには簡単な質問になってしまうかもしれませんが
10個の欄を作って5個の欄に数字を入れ、降順で並べ替えて残りの5個に結果を表示するというものを作っているんですが失敗してしまいます
ご教授いただければ幸いです
下記のように書いたのですがどう変更すればよろしいでしょうか?
textboxの定義づけ(ac等)
Dim lngArray() As Long
Dim lngStart As Long
Dim lngEnd As Long
lngArray(0) = ac
lngArray(1) = ad
lngArray(2) = ae
lngArray(3) = af
lngArray(4) = ag
Dim i As Long
Dim j As Long
Dim w As Long
If Not CBool(lngStart) Then lngStart = LBound(lngArray)
If Not CBool(lngEnd) Then lngEnd = UBound(lngArray)
If lngStart >= lngEnd Then Exit Sub
i = lngEnd
Do Until i <= lngStart
j = lngStart
Do Until j >= i
If lngArray(j) >= lngArray(j + 1) Then
w = lngArray(j)
lngArray(j) = lngArray(j + 1)
lngArray(j + 1) = w
End If
j = j + 1
Loop
i = i - 1
Loop
結果を違う欄に入力
lngStart と lngEnd の処理が邪魔。分かり難くしてる。
全部削除した方が良いと思います。
配列を引数で渡したら、バブルソートでデータを整列させて
戻り値で返すような別関数にして、バブルソートの正しい
動作を確認してみてください。
入力チェックや、指定した要素だけ入れ替えるなどの機能拡張を
考えるのは、その後で良いのでは?
…と思ったが。。。授業でやってるなら自分の実力が伸びる
コードにすべきで。。。模範解答に近くしても意味ないんだよね。
…えーと。上のコードでもとりあえず、それなりに動きましたけど、
>失敗してしまいます
具体的に何がどう失敗しますか?
エラーメッセージが出るならそれを正確に書き写してください。
エラーの出る行も特定してください。
返答ありがとうございます
独学でやっているものでネットと本を参考にしてやっております
>エラーメッセージが出るならそれを正確に書き写してください。
変数"lngArray"は値が割り当てられる前に使用されていますとで、デバックで実行しようとすると、
NullReferenceExceptionはハンドルされませんでした
と出ます
>エラーの出る行も特定してください。
エラーというか警告なんですが
lngArray(0) = ac
の部分です
verは2005を使用しております
>>NullReferenceExceptionはハンドルされませんでした
バブルソート関係ないですね^^;
すいません無知なもので
url先を拝見させてもらいましたがこの場合どのように変えたらよろしいのでしょうか?
Redim
Redim Preserve
Erase
IsNothing
あたりが、配列処理でよく使う命令ではないかと。
ちょっと調べてみてください。
独学ということなので少し解説を加えておきます。
配列の宣言について基礎学習を行ってください。
入門本で配列を学習するページに必ず書いてある
ような内容です。
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D%E5%88%97%E3%80%80%E5%AE%A3%E8%A8%80%E3%80%80VB&lr=
配列とは、同じ型のデータを連続的に並べたものです。
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D%E5%88%97%E3%81%A8%E3%81%AF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
(少し高度な理解をするなら、先頭のデータのメモリ番地
が格納される参照変数となります)
メモリ上にどのように確保されるかイメージしてみて
ください。
同じ部屋が連続的に並ぶマンションのように、
同じ型のデータを格納できる部屋が要素の数だけ
用意されます。
では、
> Dim lngArray() As Long
この宣言で部屋を何個用意しますか?
…答えは『用意できない』です。部屋の数が
分かりませんので。このような場合VBは、
マンションの土台のみしか用意しません。
部屋がまだ用意されていないのにデータ(住人)に
『入れ』って命令しても『無理っ!』って
なります。これがエラーメッセージの意味です。
>変数"lngArray"は値が割り当てられる前に使用されています
どの様に修正するか?ですが、
> Dim lngArray(4) As Long
部屋の数を明示的に宣言します。
もしくは
そがっちさんご紹介の Redim を使います。
コードで Redim と書いて選択状態にし、[F1]キーを
押してください。ヘルプに飛びます。使用方法として
サンプルコードも載ってますので理解してください。
なぜ後から部屋の数が変えられるのでしょう?
現実のマンションで住人に応じて部屋数を変えるのは
難しいですが、維持費がかかって効率が悪いですよね?
メモリ上の部屋の数が自由に増減できると、不必要な
部屋を作らないことが可能なので、便利だからです。
質問とは関係ないですが、
> If lngArray(j) >= lngArray(j + 1) Then
> w = lngArray(j)
> lngArray(j) = lngArray(j + 1)
> lngArray(j + 1) = w
> End If
等価(イコール)の時も入替えています。
…でも、入替えた結果って…同じですよね?
じゃあ、無駄な入替えの処理が実行されますよね?
最初の If 文に =(イコール)は必要ないでしょう。
Cですけど、VBのコードと見比べれば意味は分かると思います。
自分のコードと見比べてください。
http://www.codereading.com/algo_and_ds/algo/bubble_sort.html
特攻隊長まるるう さん、ご苦労様です。
私の方も丸投げばかりというのはアレなので、Long型1次元配列に
データを追加していく関数を作ってみました。
参考になればいいのですが…
Private Sub AddLongDataToArray(ByRef array() As Long, ByVal dat As Long)
If IsNothing(array) Then
ReDim array(0)
Else
ReDim Preserve array(UBound(array) + 1)
End If
array(UBound(array)) = dat
End Sub
特攻隊長まるるうさん、かさのばさん、さがっちさん
返答頂きありがとうございました
皆さんの返答を元に作り直したところ動くようになりました
ツイート | ![]() |