引数にバイト配列を指定するには?

解決


たかみちえ  URL  2001-08-04 08:10:47  No: 74722  IP: [192.*.*.*]

Byte型の配列を引数に指定するには、引数を何型にして置けばいいんでしょうか?
バリアント型でならいいんですけど、そうするとその配列を引数にして、他の関数を実行できないんです。
リファレンスには、ParamArray 〜〜というのがあるけど、それもなぜか使えないし、記述がおかしいのかな…。

編集 削除
Say  2001-08-04 22:52:17  No: 74723  IP: [192.*.*.*]

質問の意味がよくわからないのですが、
byte配列を素直にbyte配列で渡しては
まずいのですか?

たとえば

Sub disparray(a() As Byte)
    Dim i As Long
    For i = 0 To 100
        List1.AddItem a(i)
    Next
End Sub

Private Sub Command1_Click()
    Dim i As Long
    Dim a(100) As Byte
    For i = 0 To 100
        a(i) = i * 2
    Next
    Call disparray(a())
End Sub

とかやるだけでいいと思うのですが・・・

編集 削除
たかみちえ  2001-08-05 09:43:12  No: 74724  IP: [192.*.*.*]

ごめんなさい^^;引数()の"()"を忘れてました^^;
  ところで、それを使って、こんな関数を作ったんですけど、
みょうに重いんです。
どこかで見つけた、MIDIデータタイトル取得のモジュールでは、1秒もかからないのに…。

Public Function inbit(start As Long, bytecode() As Byte, search As String, Optional Searchend As Long = -1) As Long
    Dim i As Long, Leng As Integer, b As Integer
    On Error GoTo 2
    i = start
    Leng = Len(search)
1   Do
        If Searchend <> -1 And Searchend <= i Then Exit Do
        If bytecode(i) = "&H" & Mid(search, 1, 2) Then
            For b = 2 To Leng / 2
                If "&H" & Mid(search, b + (b - 1), 2) <> bytecode(i + (b - 1)) Then _
                       i = i + 1: GoTo 1
                If b = Leng / 2 Then inbit = i
            Next
        End If
        i = i + 1
    Loop
2
End Function
たとえば、MIDIの楽譜にむかって"00FF0316"を検索すると、
22あたりが返ってきます。
検索文字列が長すぎなのかなぁ…。

編集 削除
こころ  URL  2001-08-05 19:47:02  No: 74725  IP: [192.*.*.*]

文字列型っていうのが一番の問題でしょう。
また、ループ内に関数や数式が多すぎます。
bytecode関数がどの程度の規模なのかはりりませんが・・・。
検索するものを文字列で指定するにしても
ループ内部で変換していては、遅いのは当然では?
変数に待避するなどするべきでしょう。

また、このぐらいの処理ではたいしたことも無いと思いますが
配列等で大量にメモリを消費する場合以外は
Long型を使用した方がより高速になります。

編集 削除
たかみちえ  2001-08-05 22:06:46  No: 74726  IP: [192.*.*.*]

>bytecode関数がどの程度の規模なのかはりりませんが・・・。
  bytecode()は引数ですよ。
MIDIデータの場合、だいたい100000くらいですね。
でも、検索では使わないので、あんまり意味ないです。

  それにしても…。
サンプル内では、文字列で検索してると思うんですけど…。
if data(a+c)=&HFF Then という節がありましたけど、
これは最初から数値…?
とにかく、文字列を数値型配列22文字ずつ入れておいたほうがいいみたいですね。

編集 削除
こころ  URL  2001-08-05 23:56:43  No: 74727  IP: [192.*.*.*]

> bytecode()は引数ですよ。
すいません、うっかり。
っていうか、掲示板だとコードが字下げされなくて
見にくいんですよね・・・。
(いいわけ)

所で、サンプルってどのサンプルなんでしょうか???
&HFFってのは16進表記で記載されている数値です。
文字列の値であるなら必ず「"」で囲む必要があるので。
所で、22文字ってのは何なんでしょう?
上限が22文字ってことでしょうか???

編集 削除
たかみちえ  2001-08-06 08:04:03  No: 74728  IP: [192.*.*.*]

>所で、22文字ってのは何なんでしょう?
>上限が22文字ってことでしょうか???
MIDIでは、恐らくだいたい、"00FF0316"は22文字あたりに来ると思います。
まだあまり理解していないのでどうとも言えませんけど、
これは第一トラックのタイトル(曲名)のはじまりをあらわすからです。
まあ、まさか曲の途中に書くこともないと思うので…^^;

  ところで数値扱いなんですか。(やっぱり)
サンプルというのは…。まあ、サンプル内にURLが書いてなかったのでわからないんです。
たしかどこか…。VBRingかそのほかの場所…?
MIDIデータをバイナリで開いて、曲名のところを調べ、そこから閉じるまでの文章を返すものです。

>っていうか、掲示板だとコードが字下げされなくて
>見にくいんですよね・・・。
>(いいわけ)
  初心者掲示板では、こういうことしてもだいじょうぶ(らしい)のに…。
同じ掲示板使ってるのに…。
空白を置換えて消してると思うけど、CGIからその部分を消せば…。

編集 削除
たかみちえ  2001-08-06 09:45:11  No: 74729  IP: [192.*.*.*]

やってみたところ、すごく早くなりました。ありがとうございます。

  ところで、あとは文字列変換ですけど、
Public Function AsString(bytecode As String) As String
    Dim i As Long, bit() As Byte
    ReDim bit(Len(bytecode) / 2)
    For i = 1 To Len(bytecode) / 2
        bit(i) = "&H" & Mid(bytecode, (i + i - 1), 2)
    Next
    AsString = StrConv(bit, vbUnicode)
End Function
  としてみたら、からの文字列しか返ってきませんでした。
引数には、同じMIDIファイルの26バイト目から22バイト分をあつめて、Hexs(Hexのテーブル化したもの)で文字列にしたものです。
vbFromUnicodeを使ったら、ヘンな文字が返ってきたので、
失敗して空っぽの文字列になったというわけではないようです。けど…。

編集 削除
こころ  URL  2001-08-06 22:26:50  No: 74730  IP: [192.*.*.*]

検索というか、フォーマット調べて正確にやるのを
お薦めしますが・・・・。

00FF0316って
メタイベントのシーケンス名やトラック名を示す
コードのことでしょうか。
別に最初にくるとは限らないはずですよ。
コメント等、文字列データを含むメタイベントも他にありますし。
まぁ、適当でいいって言うなら別にいいんですが・・・。

編集 削除
こころ  URL  2001-08-06 22:30:41  No: 74731  IP: [192.*.*.*]

んで、変換関数ですがiが1なのはいいんでしょうか?
配列が1から始まる宣言(名前忘れた・・・)を使ってますよね?
使ってないと、最初が0になってNULLになりそうですが。

編集 削除
Say  2001-08-07 09:26:00  No: 74732  IP: [192.*.*.*]

>配列が1から始まる宣言(名前忘れた・・・)
Option Base 1 
のことですね

編集 削除
たかみちえ  2001-08-07 10:11:25  No: 74733  IP: [192.*.*.*]

>んで、変換関数ですがiが1なのはいいんでしょうか?
  忘れてました^^;
…で、でも、先頭文字がナル文字(ほんとはヌル文字って読むのは知ってます)になっちゃうんですけど。
あれはもう、当然と思っていいんでしょうか?
(同関数で、bytes(bytecode,0,4)とした場合、"・MThd"になりました、bytesは前に書きこんだとおりの、寄せ集めて文字列にする関数です)

>00FF0316って
>メタイベントのシーケンス名やトラック名を示す
>コードのことでしょうか。
  そうですけど、どうやらちがいますね、
00FFまでは固定だけど、0316はデータ長のようです。
最後が00FFというのは決まってるらしいですけど。

  ところで、これって仕様書とまったく違うんですけど…。
00FFって、たしかフォーマット0や1にはないような…。
理解のし方が悪いんでしょうか?
こうなったら自分で解釈しちゃったほうがいいのかな…。

>まぁ、適当でいいって言うなら別にいいんですが・・・。
  てきとうでいいです。歌詞とSTOPイベント以外は。たぶん。
  リアルタイムで歌詞表示は、ちょっと当分ムリかも。

編集 削除
たかみちえ  2001-08-08 15:40:44  No: 74734  IP: [192.*.*.*]

理解のし方が悪いんですね^^;
OOFF02で、FF02だけとってが正解ですね。

編集 削除
たかみちえ  2001-08-09 20:20:00  No: 74735  IP: [192.*.*.*]

データ長の文字列削除は、何とか成功しました。
Asciiコードで13以下だったら、それを消す関数です。
というわけで解決ということにします。
ありがとうございました。
あとはMIDIの読み取りですね

編集 削除
たかみちえ  2001-08-09 20:20:19  No: 74736  IP: [192.*.*.*]

わすれた^^;

編集 削除