[リストへもどる]
一括表示

投稿時間:2003/09/05(Fri) 19:17
投稿者名:Pana
Eメール:
URL :
タイトル:
配列の構造体の一部のデーターを渡す
この掲示板でかなり勉強させて頂いております。

構造体を配列で宣言して時間ごとのデーターを蓄積して、一定時間ごとに平均化したいのです。
ソースは
モジュール内で

Public Type Ch
    No1 As Integer
    No2 As Integer
    No3 As Integer
End Type

Public Type Temp
    Kikan As Ch
    Zikuuke As Ch
    Reikyaku As Ch
End Type

フォームで
Option Explicit
Dim Kikan_Temp As Temp
Dim Kikan_Ave(100) As Temp

Private Function Ave(Data() As Integer) As Integer
Dim Temp As Long
Dim Cont As Integer

    For Cont = 0 To 100
        Temp = Temp + Data(Cont)
    Next Cont

    Ave = Temp / 100
    
End Function

Private Sub Command1_Click()

    Label1.Caption = Ave(Kikan_Ave().Kikan.No1)   ←このような形で渡したい
                          
End Sub

修節子が不正です。 とエラーでデーターを渡すことが出来ません。
このような渡し方は出来ないのでしょうか?
よろしくお願いします。

投稿時間:2003/09/06(Sat) 00:33
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 配列の構造体の一部のデーターを渡す
下記ではだめでしょうか?

Private Function Ave(Data() As Temp) As Integer
    Dim Temp As Long
    Dim Cont As Integer

    For Cont = 0 To 100
        Temp = Temp + Data(Cont).Kikan.No1
    Next Cont

    Ave = Temp / 101  '0 To 100 なら 101
    
End Function

Private Sub Command1_Click()
    Label1.Caption = Ave(Kikan_Ave())
End Sub

投稿時間:2003/09/06(Sat) 07:00
投稿者名:Pana
Eメール:
URL :
タイトル:
Re^2: 配列の構造体の一部のデーターを渡す
早々のレスありがとうございます。

少々言葉が足りなかったみたいです、平均化したいデーターが多数有る為
平均化する関数を一つにして使い回したいと思っています。
配列のなかのデーターか、配列のプロパティを渡したいと思っています
何か良い方法有りましたらよろしくお願いします。

この部分を何とか使い回したい思います
Private Function Ave(Data() As Integer) As Integer
Dim Temp As Long
Dim Cont As Integer

    For Cont = 0 To 100
        Temp = Temp + Data(Cont)
    Next Cont

    Ave = Temp / 101
    
End Function

投稿時間:2003/09/06(Sat) 22:19
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 配列の構造体の一部のデーターを渡す
構造体を配列に簡単に代入できるといいのですが、出来ても下記より複雑になるかも?

Private Sub Command1_Click()
    Label1.Caption = Ave(Kikan_Ave(), 1)
End Sub

Private Function Ave(ByRef Data() As Temp, ByVal No As Integer) As Integer
    Dim Temp As Long
    Dim Cont As Integer
    For Cont = 0 To 100
        Select Case No
            Case 1
                Temp = Temp + Data(Cont).Kikan.No1
            Case 2
                Temp = Temp + Data(Cont).Kikan.No2
            Case 3
                Temp = Temp + Data(Cont).Kikan.No3
            Case 4
                Temp = Temp + Data(Cont).Reikyaku.No1
            Case 5
                Temp = Temp + Data(Cont).Reikyaku.No2
            Case 6
                Temp = Temp + Data(Cont).Reikyaku.No3
            Case 7
                Temp = Temp + Data(Cont).Zikuuke.No1
            Case 8
                Temp = Temp + Data(Cont).Zikuuke.No2
            Case 9
                Temp = Temp + Data(Cont).Zikuuke.No3
        End Select
    Next Cont
    Ave = Temp / 100
End Function

投稿時間:2003/09/06(Sat) 23:09
投稿者名:Pana
Eメール:
URL :
タイトル:
Re^4: 配列の構造体の一部のデーターを渡す
いろいろご教授ありがとうございます。
この方法でやってみます、何故数が多い為出来るだけ少ないソースでやりたくて・・・

少し質問の趣旨が異なってしまうかもしれませんが、

Temp.Zikuuke.No1 と構造体のの中を参照するときには書きますが
「.Zikuuke.No1」の部分を変数にして渡すことは可能でしょうか?
いろいろ試してみましたけどもどうもうまくいかないので何か手だてがありましたら教えて下さい
よろしくお願いします。

投稿時間:2003/09/06(Sat) 23:15
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: 配列の構造体の一部のデーターを渡す
> 「.Zikuuke.No1」の部分を変数にして渡すことは可能でしょうか?

CallByName関数を使うという方法があります。

ただしその場合は、そのユーザー定義型を、
COMとしてレジストリ登録されたパブリックな構造体にするか、
もしくは、ユーザー定義型をクラス化する必要があるでしょう。


…でもそこまでやるのなら、Temp型の配列を独自のコレクションクラスに変更して、
そこに、「メンバの平均値を返すメソッド」を実装した方が、コードとしてはスマートかも。

投稿時間:2003/09/07(Sun) 15:15
投稿者名:Pana
Eメール:
URL :
タイトル:
Re^6: 配列の構造体の一部のデーターを渡す
> CallByName関数を使うという方法があります。

これもめんどくさいみたいですね〜

> …でもそこまでやるのなら、Temp型の配列を独自のコレクションクラスに変更して、
> そこに、「メンバの平均値を返すメソッド」を実装した方が、コードとしてはスマートかも。

ごめんなさい、ほとんど理解できませんこの方法はもっと勉強してみます。
本当にありがとうございました。