関数等の分岐を簡素に記述するには

解決


トマト  2004-11-08 20:21:44  No: 86560  IP: [192.*.*.*]

いつも参考にさせれ頂いています。

下<1><2>のようなことをさせる場合case文で分岐させるのではなくて配列をindexで指定する場合のように簡単なほうほうでに記述する方法はありませんか?

ちなみに<1>の変数が100位
<2>の間数が50位あります。


<1>
dim no1 as string
dim no1 as byte
dim no3 as single

select case i
 case 1
   no1="1"
 case 2
   no2=1
 case 3
   no3=123.123
end select

<2>
select case i
 case 1
   no1’関数1
 case 2
   no2’関数2
 case 3
   no3’関数3
end select

編集 削除
ガッ  2004-11-08 21:45:40  No: 86561  IP: [192.*.*.*]

ポリモーフィズムを使えば…なんとかなるかもしれないが、遅いし危ない。
スマン、駄スレだったかもしらん。

編集 削除
トマト  2004-11-08 22:05:27  No: 86562  IP: [192.*.*.*]

ガッ さんこんばんは。ポリモーフィズムですか?
でも処理スピードが遅くなると困るなぁ〜

編集 削除
Say  2004-11-08 23:39:38  No: 86563  IP: [192.*.*.*]

>配列をindexで指定する場合のように簡単なほうほうでに記述する方法はありませんか?

コールバック使って、関数ポインタもどきを実装すれば、
可能なような気もしますが・・・。

編集 削除
java.lang.Nullpo  2004-11-09 09:36:56  No: 86564  IP: [192.*.*.*]

そもそも、何でそんなムリな仕様なのかが気になります?
少しだけでもお話を聞きたいですね。
別の道があるかもしれませんから。

編集 削除
ぺがらぼ  URL  2004-11-09 11:34:55  No: 86565  IP: [192.*.*.*]

とりあえず、配列化がどうとか簡単にしたいとかの問題ではなく、最初にすべきことは、似たようなパターンがどのぐらい有るのか、無いのかによると思いますよ。
徐に、配列化したり関数化したりする事で解りにくくなったり、処理スピードが遅くなったりしますから。

編集 削除
トマト  2004-11-09 11:57:15  No: 86566  IP: [192.*.*.*]

多次元配列を動的配列にした場合でも、メンバーは固定されてしまうと思いますが、したいことは、そのメンバーを動的配列にするような感じです。

private type data1
   b(100) as integer
   c as string
   d as string
   e as integer
   f as string
   g as string
   h as integer
end type

private a() data1

上記の場合aは動的配列であっても、bを動的配列にできないというか、使用上無理だと考えます。

そこでメンバーbの代わりにbの必要素数をメンバーに記憶させてその必要素数で宣言した変数を読み出したいと考えているのです。

<2>
select case i
 case 1
   no1’関数1
 case 2
   no2’関数2
 case 3
   no3’関数3
end select

この場合にiを  no & i 見たいに記述でいないものかなぁと思ったのですが、、、

編集 削除
de  2004-11-09 12:10:32  No: 86567  IP: [192.*.*.*]

バリアントじゃだめなんですか?

編集 削除
トマト  2004-11-09 12:25:32  No: 86568  IP: [192.*.*.*]

使用メモリを小さくしたいのでバリアントは考えていません。

上記  private a() data1  は例えですが、

実際は a  のようなものの配列数は多いときで30万以上になります。

編集 削除
de  2004-11-09 13:07:03  No: 86569  IP: [192.*.*.*]

選ぶ言語を誤っていると思います。
できればCで組んだ方がいいんじゃないですか。

編集 削除
ねろ  2004-11-09 13:14:16  No: 86570  IP: [192.*.*.*]

b()はユーザー定義型からはずして置いて、
一つだけ宣言して、頭から使っていき
ユーザー定義型にはどこから使っているか
最初の位置と、幾つ使っているかの個数を
記憶させるということですか?
なぜ関数のポインターが必要なのか
今ひとつわからないのは私だけか。。。

編集 削除
ガッ  2004-11-09 13:21:12  No: 86571  IP: [192.*.*.*]

オレも、さっぱり言いたいことが分からない(orz
−−−−−−
>多次元配列を動的配列にした場合でも、メンバーは固定されてしまうと思いますが、
多次元配列の動的配列:Dim Array()
メンバは配列の動的、固定に関係ないかと…

>したいことは、そのメンバーを動的配列にするような感じです。
「その」とは、「配列の型」のことだよな?
Type x
  member()
End Type
ということか?

>private type data1
>   b(100) as integer
>   c as string
>   d as string
>   e as integer
>   f as string
>   g as string
>   h as integer
>end type
>
>private a() data1
>
>上記の場合aは動的配列であっても、bを動的配列にできないというか、使用上無理だと考えます。
data1のメンバを動的配列にしたいんじゃなかったんか?

>そこでメンバーbの代わりにbの必要素数をメンバーに記憶させてその必要素数で宣言した変数を読み出したいと考えているのです。
句読点がないので、オレなりに書き下してみた。
「そこでメンバーbの代わりに、bの必要要素数をメンバーに記憶させて、その必要素数で宣言した変数を、読み出したいと考えているのです。」
つまり、
Type x
  sizeOf_b
  b()
End type
か?
ところで、「必要素数で宣言した変数」ってどんな変数?

><2>
>select case i
> case 1
>   no1’関数1
> case 2
>   no2’関数2
> case 3
>   no3’関数3
>end select
>
>この場合にiを  no & i 見たいに記述でいないものかなぁと思ったのですが、、、
この「no1、no2...」って、「関数」?
…今までユーザ定義型の「b」について話してきた記憶が…
ここで、いきなり仮定から外れているのか?
まぁ、no1、no2…が関数で、VBのみで実現するといったら、やっぱりポリモーフィズムしかないかと…

−−−で、次−−−
>使用メモリを小さくしたいのでバリアントは考えていません。
>
>上記  private a() data1  は例えですが、
>
>実際は a  のようなものの配列数は多いときで30万以上になります。
aの型のサイズより、明らかにVariantの方が小さいと思うのだが…
気のせいか…?


ちなみにVB6。
そして激しく誤爆の予感…

編集 削除
ぺがらぼ  URL  2004-11-09 13:49:05  No: 86572  IP: [192.*.*.*]

VB6ならVariant、VB.NETならObjectにして動的なデータサイズにした方が綺麗ではないですが、使用メモリは小さくなりますよ。

正直<2>は何がしたいのか解りません。もう少し具体的な説明をしていただけないでしょうか?

編集 削除
ねろ  2004-11-09 14:03:19  No: 86573  IP: [192.*.*.*]

読めば読むほど不可解な。。。。
>上記の場合aは動的配列であっても、bを動的配列にできないというか、使用上無理だと考えます。
使用上  ->  仕様上か

Private Type data1
   b() As Integer
   c As String
   d As String
   e As Integer
   f As String
   g As String
   h As Integer
End Type
Dim a() As data1

Private Sub Form_Load()
    ReDim a(10)
    ReDim a(1).b(50)
    ReDim a(2).b(200)
    a(1).b(22) = 22
    a(2).b(122) = 122
    Debug.Print a(1).b(22)
    Debug.Print a(2).b(122)
End Sub
こんなんなら出来るけど。

編集 削除
LESIA  2004-11-09 14:40:42  No: 86574  IP: [192.*.*.*]

こういうことがやりたいんでしょうか?

'****************************************
'Class1.clsのコード
'****************************************
Option Explicit

Private m_no1 As String
Private m_no2 As Byte
Private m_no3 As Single

Public Property Get no1() As String
    no1 = m_no1
End Property

Public Property Let no1(ByVal NewValue As String)
    m_no1 = NewValue
End Property

Public Property Get no2() As Byte
    no2 = m_no2
End Property

Public Property Let no2(ByVal NewValue As Byte)
    m_no2 = NewValue
End Property

Public Property Get no3() As Single
    no3 = m_no3
End Property

Public Property Let no3(ByVal NewValue As Single)
    m_no3 = NewValue
End Property

Public Sub proc1()
    MsgBox "関数1"
End Sub

Public Sub proc2()
    MsgBox "関数2"
End Sub

Public Sub proc3()
    MsgBox "関数3"
End Sub

'****************************************
'Form1.frmのコード
'****************************************
Option Explicit

Private Sub Command1_Click()
    Dim objClass1 As Class1
    
    Set objClass1 = New Class1
    
    CallByName objClass1, "no" & 1, VbLet, "1"
    CallByName objClass1, "no" & 2, VbLet, 1
    CallByName objClass1, "no" & 3, VbLet, 123.123

    MsgBox objClass1.no1
    MsgBox objClass1.no2
    MsgBox objClass1.no3


    CallByName objClass1, "proc" & 1, VbMethod
    CallByName objClass1, "proc" & 2, VbMethod
    CallByName objClass1, "proc" & 3, VbMethod

    Set objClass1 = Nothing
End Sub

編集 削除
LESIA  2004-11-09 14:45:42  No: 86575  IP: [192.*.*.*]

修正。
    MsgBox objClass1.no1
    MsgBox objClass1.no2
    MsgBox objClass1.no3
じゃなくて
    MsgBox CallByName(objClass1, "no" & 1, VbGet)
    MsgBox CallByName(objClass1, "no" & 2, VbGet)
    MsgBox CallByName(objClass1, "no" & 3, VbGet)
ですね。

編集 削除
トマト  2004-11-09 14:47:52  No: 86576  IP: [192.*.*.*]

みなさん、ありがとうございました。
私の説明が悪くてしたいことがうまく伝えられず反省しています。
ねろさんのをテストしてみたところ私のしたいことができました。
勉強不足で、しかも、ひらめきませんでした。

編集 削除
トマト  2004-11-09 14:52:02  No: 86577  IP: [192.*.*.*]

返信を書いてる間に、、、

LESIA さん
ありがとうございます。

せっかく書いていただいたのでテストしてみます。

編集 削除