tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル構造体のソートについて
記事No1758
投稿日: 2005/05/26(Thu) 14:35
投稿者ことり
[OSのVer]:Windows xp   [VBのVer]:VB.NET2003  
初めて投稿します。
   Structure kaisha
        Dim code As String
        Dim namae As String
    End Structure
Dim a(3) As kaisha
と定義し、
    a(1).code = "0001": a(1).namae = "あらき"
        a(2).code = "0003": a(2).namae = "やまだ"
        a(3).code = "0002": a(3).namae = "たなか"
のデータをコード順にソートしようと思って
Array.Sort(a)
とすると、
「追加情報 : 指定された IComparer が例外をスローしました。」
というエラーが発生しました。
何しろ、超初心者なのでエラーの意味が理解できません。
どのように記述すればいいのか、さっぱり判りません。
どなたか、ご教授お願いいたします

[ツリー表示へ]
タイトルRe: 構造体のソートについて
記事No1759
投稿日: 2005/05/26(Thu) 15:39
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
こんにちは、じゃんぬ です。

まず、構造体に IComparable インターフェイスを実装してください。

    Public Structure Kaisha
        Implements IComparable

        Public Code As String
        Public Name As String

        Public Overloads Function CompareTo(ByVal obj As Object) As Integer Implements
System.IComparable.CompareTo
            If TypeOf obj Is Kaisha Then
                Return Me.CompareTo(DirectCast(obj, Kaisha))
            End If
        End Function

        Public Overloads Function CompareTo(ByVal value As Kaisha) As Integer
            Select Case Me.Code
                Case Is = value.Code
                    Return 0
                Case Is > value.Code
                    Return 1
                Case Else
                    Return -1
            End Select
        End Function

    End Structure

ところで、kaisha(0) の要素は Nothing ですが、理解されてるでしょうか?

[ツリー表示へ]
タイトルRe^2: 構造体のソートについて
記事No1760
投稿日: 2005/05/26(Thu) 17:47
投稿者ことり
「じゃんぬ 」さん。すばやい回答ありがとうございます。感激しました。
ただ、先ほどからコードをにらみ、理解しようと勤めているのですが、やはり超初心者の私にとって、

のコードはかなり難しく困っています。

>kaisha(0) の要素は Nothing ですが、理解されてるでしょうか?

ご指摘のとおり、全く理解できていません。
理解できないままに、書いていただいたコードの後ろに
Public a(3) as string
a(1).code = "0001": a(1).namae = "あらき"
a(2).code = "0003": a(2).namae = "やまだ"
a(3).code = "0002": a(3).namae = "たなか"
を追加するとaが「名前aは宣言されていませんと」エラーが表示されます。
きっと、「 kaisha(0) の要素は Nothing」に関連しているのでしょうね。
手元に数冊ある入門書を読み漁ったのですが、構造体の説明は、あっさりしたもので参考になりません

自分の勉強不足を棚に上げて、申し訳ないのですが、
「kaisha(0) の要素は Nothing」と「名前aは宣言されていません」の2点について
説明いていただけませんか?よろしくお願いします。
因みに、今チャレンジしているソフトは、配列を多用していますが、配列を構造体にすると読みやすく

ると同時に処理も簡単になると考えています。

[ツリー表示へ]
タイトルRe^3: 構造体のソートについて
記事No1761
投稿日: 2005/05/27(Fri) 09:12
投稿者るしぇ
キツい言い方かもしれないけど、勉強不足とかいうレベルにも達してないね。
プログラムの基礎まで掲示板で聞いているとキリがないですよ。
構造体でなく配列が分かってません。入門本には必ず書いてある事です。
もう一度勉強しましょう。

まぁ、幸い[VB.NET]はヘルプの内容もそこそこ充実してるので、
やる気さえあればかなり自分で調べられますが…。
[配列]
hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconarraysoverview.asp
[配列の概要]-[配列のサイズ]に書いてありますが、
>配列の要素は、各次元の添字 0 から最大の添字まで連続しています。
という事で、
>Dim a(3) As kaisha
と宣言すると0〜3の4つの要素が確保されます。
が、ことりさんは a(0) を設定していませんので
>kaisha(0) の要素は Nothing ですが、理解されてるでしょうか?
となります。デバッグして確認してみれば分かる事なんですが、
a(0).code = Nothing
a(0).namae = Nothing
という初期値のままです。

>理解できないままに、書いていただいたコードの後ろに
>Public a(3) as string
>名前aは宣言されていません
なんで今更 String で宣言?滅茶苦茶になってますよ?それと、
後ろに書いてはダメです。変数の宣言は使用する部分より前に
書いてないと、[VB.NET]が見つけられません。…というか、
変数の宣言は関数やクラスの先頭にまとめて行うクセを付けて
おきましょう。いろんな場所で変数を宣言すると、修正する時に
変数を探すのに時間が掛かったり、同じ名前でローカル変数を
宣言できてしまったり、…ごちゃごちゃになります。
…てゆーか、あれ?…今、見直してると…
>書いていただいたコードの後ろに
ってじゃんぬさんのコードよね?a() は関係ないハズ…いったい
どこに宣言したんだろう(悩)普通そのエラーは出ないです。…
a() の宣言の位置はドコでしました?構造体の中でとかはさすがに
してないですよねぇ?。

>因みに、今チャレンジしているソフトは、配列を多用していますが、
>配列を構造体にすると読みやすくなると同時に処理も簡単になると
>考えています。
考えは悪くないと思うけど、
hhttp://www.atmarkit.co.jp/fdotnet/vb6tonet2/index/index.html
>Chapter 02 データ型の変化
の配列の操作に関しての記事くらいは基礎知識として欲しいところ…。
知識がないと読みやすくなるとは限らないし、簡単になるとも
思えない。

[ツリー表示へ]
タイトルRe^4: 構造体のソートについて
記事No1762
投稿日: 2005/05/27(Fri) 09:54
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
るしぇ さん、いつもフォローありがとうございます。

> 構造体でなく配列が分かってません。入門本には必ず書いてある事です。
> もう一度勉強しましょう。
> ことりさんは a(0) を設定していません
> デバッグして確認してみれば分かる事なんですが、

そうですね、配列が 0 から始まるということがわかってないだけかもしれません。

ことり さん、もし可能であれば、ブレークポイントをメソッドの先頭に仕掛け、
インラインで実行していき、配列の中身がどうなっているか確認してみてください。
説明を聞くより、おそらく自分の目で確認された方が良いと思います。

> 変数の宣言は関数やクラスの先頭にまとめて行うクセを付けておきましょう。

ちょっと、後から見る方に誤解が生じるかもしれないので補足します。

正しくは、「関数やクラスの先頭に」というよりは「使うべきスコープの先頭に」だと思います。
でないと、「ブロック変数」の立場がなくなってしまいますから...
メソッド全体で使う「ローカル変数」は先頭で宣言すべきです。
ステートメントのブロック内で使用する「ブロック変数」はそのステートメントの先頭に宣言すべきです。

ブロック変数の使用は、コンパイラの最適化にもつながります。

[ツリー表示へ]
タイトルRe^5: 構造体のソートについて
記事No1764
投稿日: 2005/05/27(Fri) 11:58
投稿者るしぇ
>正しくは、「関数やクラスの先頭に」というよりは「使うべきスコープの先頭に」だと思います。
はい(^^)…では『適切なスコープで変数を宣言する』ことを
理解してないであろう質問者の方に、更にキリキリ勉強して
頂きましょうかねw。変数のスコープ…これも入門本の
『関数を呼び出す』といったような基本操作の部分に、必ず
書いてるような基本知識です。ByRef ByVal あたりの説明と
併記されてる場合も多いですね。当然[VB.NET]のヘルプにも
載ってます。
[変数のスコープの選択]
hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vbconadvancedvariabletopics.asp
変数のスコープ(有効範囲)はできるだけ狭く、その範囲を
適切に選択できる事が重要です。その上で、スコープの
先頭にて変数を宣言します。
>手元に数冊ある入門書を読み漁ったのですが、構造体の説明は、あっさりしたもので参考になりません。
その入門書がどのレベルのものかは分かりませんが、構造体云々
より以前の知識が全く足りてない事を実感してますか?。どれでも
いいですので1冊選択して下さい。読み漁るのでなく、最初の
ページから1冊だけで良いですので、全て読んで、全てのサンプル
プログラムを自分で書いて実行して下さい。それができて初めて
[VB.NET初心者]というレベルです。

>>じゃんぬさんへ
>るしぇ さん、いつもフォローありがとうございます。
いえいえ。こちらも感謝しています。質問者の知識内で
回答しようとすると、どうしても誤解を生んでしまう
表現を避けられません。かといって、1人の回答者が
あらゆる面でフォローの入ったレスをつけると、今度は
長文レスになる上、質問者が混乱して、十分に理解
できなくなります。1人の回答者はある程度偏った(
1つの方向で)レスし、別の回答者がフォローを入れる
のが理想と思ってます。じゃんぬさんを含め、ここの
回答者の実力を十分なものと評価してツメが甘いレス
してますので、気にせずツッコミ下さいm(__)m
前スレで
>批難しているわけではないので〜
との書き込みありましたが、当然理解してます。例え
ツッコミが間違ってたとしてもご愛嬌。その時点で質問者に
ベストな回答ができるよう、お互い頑張りましょう。

[ツリー表示へ]
タイトルRe^6: 構造体のソートについて
記事No2889
投稿日: 2006/01/15(Sun) 16:00
投稿者tomo
大変参考になりました。
ことりさんとは全く無関係の人間ですが、私もわからない事がわからない状態です。
構造体の便利さもついこの間理解できたとこです。検索をすればそれに最適なコード
が出てきて「ハイ、コピペ」なんとなく解決は大変怖いです。

参考書を手にとって自力でマスターするのも大事かなと思います。
しかし、書店では○○入門とか、○○簡単なコード集につい手がでてしまうのも初心者
です。私もまと外れな本を何冊も買い込んでいます。だから初心者なのかもしれません。

じゃんぬねっとさん
るしぇさん

どこでもお見かけする私にとっては道端のお地蔵様か八百万の神様のような存在です
お読みになられるかどうかは判りませんが、本当に感謝しています。

スキルを得たい初心者(私)にとっては参考書に何十万円払っても惜しくないものです。
効率の良い参考書があれば、何日読み返しても全く苦痛ではありません。
一度体が覚えた事は一生ものですから。。

私にとってはソースコードよりも参考書を紹介いただける掲示板があればと探している
今日この頃です。
IComparable

IComparer
が全く同じにみえる。こんな事掲示板で聞けるものではありません。(TT)

[ツリー表示へ]
タイトルRe^7: 構造体のソートについて
記事No2892
投稿日: 2006/01/16(Mon) 00:00
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
> じゃんぬねっとさん
> るしぇさん
>
> どこでもお見かけする私にとっては道端のお地蔵様か八百万の神様のような存在です
> お読みになられるかどうかは判りませんが、本当に感謝しています。

お読みになりますよ。
ここの住人ですから。(^^;)

> 私にとってはソースコードよりも参考書を紹介いただける掲示板があればと探している今日この頃です。

基本的には本屋で立ち読みして、読み漁りましょう。
合った本を購入すれば良いのです。

書籍については、こちらが参考になると思います。
hhttp://vsug.jp/tabid/63/forumid/72/postid/1037/view/topic/Default.aspx

# 私は、Windows プログラマになって 2 年も経っていない若輩者なので、
# 尊敬には値しないと思います。(でも、これは言い訳に他なりません...)

[ツリー表示へ]
タイトルRe^7: 構造体のソートについて
記事No2896
投稿日: 2006/01/16(Mon) 12:03
投稿者るしぇ
いみじくもボクのレスには2つともマイクロソフトのオンラインヘルプへの
リンクが張られてます。これはローカルにインストールしたMSDNのヘルプ
と同じ内容です。(たまに更新されてますが)

>参考書を手にとって自力でマスターするのも大事かなと思います。
ボクは『まずヘルプ』派です。そこには使用方法・注意点・仕様など
が載ってます。特によく使われるクラスについてはかなり充実した
内容に思います。記述内容に間違いもありますが、よく読んで意味を
理解すれば自力で解決できる内容がそろってると思います。ヘルプ
を読み解く能力をマスターすれば、基本的なクラスのコーディングに
参考書は必要ありません。参考書を探す前に[F1]キーを押す癖を
つけましょう。
(通信だのWEBだのetc。ヘルプでサポートが薄い部分はその分野の
参考書を買う方が良いです。)

ただし、ヘルプを読み解くためにはプログラミングの基礎能力が
必要です。
>書店では○○入門とか、○○簡単なコード集につい手がでてしまうのも初心者です。
それで正解です。○○入門をマスターしているかどうかは、サンプル
コードやヘルプを理解できるかどうかに大きな影響を与えます。
クラスの構造や使用方法、オブジェクト指向などの概念は、全ての
クラスに共通して使われています。いくら複雑でも丁寧に読み解けば
○○入門をマスターしている人なら理解できます。

そのレベルに達しているなら
>まと外れな本を何冊も買い込んでいます
よりも遠慮せず質問掲示板を利用した方が効率的でしょう。
逆に、1冊マスターしてるなら、下手に参考書は買わず、自分の知識と
調べる能力で解決する訓練をしましょう。

>IComparable
>と
>IComparer
>が全く同じにみえる。こんな事掲示板で聞けるものではありません。(TT)
ボクもTVでフランス語が流れると全ての単語が同じに聞こえますが、何か?
慣れてない言語なら同じに見えることもあるでしょう。で、どうしたいんです
か?そこがハッキリしていれば質問としても十分成り立つのでは?
>Compare(動)…を(…と)比較する,比べる
これに r が付いて『比較するもの(メソッド)』的な意味かと。
>Comparable:(形)…を(…と)比較できる
先頭の I はインターフェースにつけられるコーディング規約にある規則です。
単語が見分けつかないとかいうのは、プログラムの問題じゃなくて英語の
問題だから…慣れるのが一番な気もしますが、逆に、どちらもインター
フェースだし、比較に関連してるから、名称に共通性を持たせて設計
されてます。機能の違いが知りたいならヘルプで↓
[IComparable インターフェイス]
hhttp://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemicomparableclasstopic.asp
>型固有の比較メソッドを作成するために値型またはクラスで実装する、汎用の比較メソッドを定義します。
[IComparer インターフェイス]
hhttp://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemCollectionsIComparerClassTopic.asp
>2 つのオブジェクトを比較するメソッドを公開します。

P.S.参考書にもコードは載ってて「ハイ、コピペ」なんとなく解決は
あるでしょ?それをプログラムだと思ってる偽プログラマや、開発
工程の問題でそうするしかないやっつけ仕事なんて、世の中に
ごまんとありますが?
参考書だから良い訳でもWEBだから悪い訳でもありません。
自分がどれだけ内容を噛み砕くか?です。参考書の方が
近くに、噛み砕くために必要な情報が載ってる場合が多い
というだけで、WEBでも知らない単語をもとに検索を繰り返せば
ほぼ同等の情報が得られます。
>検索をすればそれに最適なコードが出てきて
それを最適だと思うほうが怖いです。検索できるのはあくまで
サンプル。自分の環境に合わせたカスタマイズの余地は
無限にあります。自分がどれだけの改善点を見つけられて、
アイデアを出して実現できるか?が重要なのです。

[ツリー表示へ]
タイトル良いこと書きますね
記事No2911
投稿日: 2006/01/16(Mon) 22:12
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
> それを最適だと思うほうが怖いです。
> 検索できるのはあくまでサンプル。
> 自分の環境に合わせたカスタマイズの余地は無限にあります。
> 自分がどれだけの改善点を見つけられて、アイデアを出して実現できるか?が重要なのです。

良いこと書きますね。(^-^*)
Jitta 氏も同じことを書いていました。

ソースの流用は、工数が削減できるので良くやります。
もちろん、絶対にオプティマイズする必要があります。

というよりは、それができない限りは「理解できていない」ので流用するのは危険ですね。
判らなくても、オプティマイズするクセをつけることで自然と覚えることができます。

それと、私はこちらの掲示板のような技術コミュニティで回答をすることで、
知識を身につけている典型的な、偽プログラマの筆頭でしょう。(なので、ぷるぐるま を自称していま
す)
ちなみに、VB, VB.NET は掲示板で回答をしたことがきっかけで始めた言語です。
C# は業務で始めた言語ですが、殆どが掲示板から得た知識です。

やっぱり「楽しい!」と思える状況下で、自然と覚えていくのが理想ですね。
勉強だと思って、根詰めてはいけないと私は思います。

[ツリー表示へ]
タイトルRe: 構造体のソートについて
記事No1770
投稿日: 2005/05/31(Tue) 11:42
投稿者ねろ
こんな方法もあるのかな。
Returnのところにブレイクポイントを置くとクイックソートやってるのがわかる。

Option Strict On
Imports System

  Private Structure CompanyStaff
    Implements IComparable
    Public Code, Name As String
    Public Function CompareTo(ByVal obj As Object) As Integer Implements _
           IComparable.CompareTo
      Return Me.Code.CompareTo(DirectCast(obj, CompanyStaff).Code)
    End Function
  End Structure

   '//以下単に確認のコード
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click
    Dim Person As CompanyStaff()
    ReDim Person(3)
    Person(0).Code = "0004" : Person(0).Name = "すずき-0004"
    Person(1).Code = "0003" : Person(1).Name = "あらき-0003"
    Person(2).Code = "0005" : Person(2).Name = "やまだ-0005"
    Person(3).Code = "0006" : Person(3).Name = "たなか-0006"
    Console.WriteLine("ソート前")
    For Each w As CompanyStaff In Person
      Console.WriteLine(w.Name)
    Next
    Console.WriteLine("ソート後")
    Array.Sort(Person)
    For Each w As CompanyStaff In Person
      Console.WriteLine(w.Name)
    Next
  End Sub

[ツリー表示へ]