いつも参考にさせれ頂いています。
下<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
ポリモーフィズムを使えば…なんとかなるかもしれないが、遅いし危ない。
スマン、駄スレだったかもしらん。
ガッ さんこんばんは。ポリモーフィズムですか?
でも処理スピードが遅くなると困るなぁ〜
>配列をindexで指定する場合のように簡単なほうほうでに記述する方法はありませんか?
コールバック使って、関数ポインタもどきを実装すれば、
可能なような気もしますが・・・。
そもそも、何でそんなムリな仕様なのかが気になります?
少しだけでもお話を聞きたいですね。
別の道があるかもしれませんから。
とりあえず、配列化がどうとか簡単にしたいとかの問題ではなく、最初にすべきことは、似たようなパターンがどのぐらい有るのか、無いのかによると思いますよ。
徐に、配列化したり関数化したりする事で解りにくくなったり、処理スピードが遅くなったりしますから。
多次元配列を動的配列にした場合でも、メンバーは固定されてしまうと思いますが、したいことは、そのメンバーを動的配列にするような感じです。
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 見たいに記述でいないものかなぁと思ったのですが、、、
バリアントじゃだめなんですか?
使用メモリを小さくしたいのでバリアントは考えていません。
上記 private a() data1 は例えですが、
実際は a のようなものの配列数は多いときで30万以上になります。
選ぶ言語を誤っていると思います。
できればCで組んだ方がいいんじゃないですか。
b()はユーザー定義型からはずして置いて、
一つだけ宣言して、頭から使っていき
ユーザー定義型にはどこから使っているか
最初の位置と、幾つ使っているかの個数を
記憶させるということですか?
なぜ関数のポインターが必要なのか
今ひとつわからないのは私だけか。。。
オレも、さっぱり言いたいことが分からない(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。
そして激しく誤爆の予感…
VB6ならVariant、VB.NETならObjectにして動的なデータサイズにした方が綺麗ではないですが、使用メモリは小さくなりますよ。
正直<2>は何がしたいのか解りません。もう少し具体的な説明をしていただけないでしょうか?
読めば読むほど不可解な。。。。
>上記の場合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
こんなんなら出来るけど。
こういうことがやりたいんでしょうか?
'****************************************
'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
修正。
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)
ですね。
みなさん、ありがとうございました。
私の説明が悪くてしたいことがうまく伝えられず反省しています。
ねろさんのをテストしてみたところ私のしたいことができました。
勉強不足で、しかも、ひらめきませんでした。
返信を書いてる間に、、、
LESIA さん
ありがとうございます。
せっかく書いていただいたのでテストしてみます。
ツイート | ![]() |