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

投稿時間:2003/08/08(Fri) 17:05
投稿者名:shin
Eメール:
URL :
タイトル:
2次元配列で・・・
fname(i)に1〜100までファイル名をいれて
下記のようにfdataに入れたいのですが、2次元配列にするとうまくいきません・・・
どこが悪いのか、または参考になるサイトでも構いませんので
よろしくおねがいしますm(_ _)m

dim ff as long
dim fdata as long
dim flen as long

for i=1 to 100
  flen = FileLen(fname(i))
  ReDim fdata(100, flen - 1) As Byte
  ff = FreeFile
  Open fname(i) For Binary Access Read As #ff
    Get #ff, , fdata(i)
  Close #ff
next

投稿時間:2003/08/08(Fri) 22:33
投稿者名:shin
Eメール:
URL :
タイトル:
Re: 2次元配列で・・・
ちなみにエラーは
>Get #ff, , fdata(i)
この部分でインデックスの範囲が〜〜というのが起きます。

投稿時間:2003/08/08(Fri) 22:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: 2次元配列で・・・
> ちなみにエラーは
> >Get #ff, , fdata(i)
> この部分でインデックスの範囲が〜〜というのが起きます。

この配列は2次元になっていますか?

投稿時間:2003/08/08(Fri) 22:57
投稿者名:shin
Eメール:
URL :
タイトル:
Re^3: 2次元配列で・・・
返信ありがとうございます。

>この配列は2次元になっていますか?

えっと、
private fdata() as byte
で宣言して
ReDim fdata(100, flen - 1) As Byte
で変更しています。

ReDim fdata(flen - 1) As Byte
Get #ff, , fdata
だと出来たのですが、VBは初心者なのでどうもイマイチ分かってないのかもしれません・・・(汗

どうかよろしくお願いします。

投稿時間:2003/08/09(Sat) 00:18
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^4: 2次元配列で・・・
C等でしたら、配列はポインタといった認識ができるのですが、
VBにはポインタという概念がありませんので、
2次元配列はポインタの配列にはなりません。

C++でしたら
Long **d2;
d2 = new long *[10];
for(i = 0 ; i < 10 ; i++){
    d2[i] = new long [100];
}
なんてできるんですけどね

VBだと
dim d2(9,99) as double
dim d1(99) as double
for i = 0 to 9
    get #ff,,d1
    for j = 0 to 99
        d2(i,j) = d1(j)
    next j
next i

投稿時間:2003/08/09(Sat) 02:04
投稿者名:shin
Eメール:
URL :
タイトル:
Re^5: 2次元配列で・・・
解答ありがとうございました〜

とりあえずfdata(i,j)に入れたいデータが入りました〜。

それで、新たな問題が発生したのですが(汗
Putで一気に書き込もうと思ってたのですが、エラーが出てしまいました・・・
ファイルに書き込む時、やはり同じようにfor〜nextで処理しないとダメでしょうか?

お願いしますm(_ _)m

投稿時間:2003/08/09(Sat) 00:52
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^4: 2次元配列で・・・
すでに Lantern さんが回答されておられますが。
> private fdata() as byte
> で宣言して
> ReDim fdata(100, flen - 1) As Byte
> で変更しています。

Get #ff, , fdata(i)  でもこの部分は2次元ではないですよね

又、Dim fdata(100) As Byte と宣言しても101バイト保存できる変数を1個宣言したのと同じです
従って、貴方が考えているような使い方はできないと言う事になります。

>ReDim fdata(flen - 1) As Byte
>Get #ff, , fdata
>だと出来たのですが

flen = FileLen(fname(i)) これってファイル名の文字数を調べているのですよね
通常は、fname(i) のファイルのデータのサイズでないとだめかと思うのですが?

投稿時間:2003/08/09(Sat) 02:09
投稿者名:shin
Eメール:
URL :
タイトル:
Re^5: 2次元配列で・・・
>Get #ff, , fdata(i)  でもこの部分は2次元ではないですよね

こういうことでしたか・・・
すると、fdataが1次元の時は
Get #ff, , fdata
で出来るのはどうしてなのでしょうか・・・
初歩的な質問で済みません(汗

> flen = FileLen(fname(i)) これってファイル名の文字数を調べているのですよね
> 通常は、fname(i) のファイルのデータのサイズでないとだめかと思うのですが?

FileLen(fname(i))でファイルのサイズが取得出来てます〜

投稿時間:2003/08/09(Sat) 03:31
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^6: 2次元配列で・・・
> すると、fdataが1次元の時は
> Get #ff, , fdata
> で出来るのはどうしてなのでしょうか・・・

「Get #ff, , fdata」なら、ReDimしたfdata配列の全体に読み込まれ、
「Get #ff, , fdata(0)」なら、1次元配列の0番目要素だけに読み込まれ、
「Get #ff, , fdata(1)」なら、1次元配列の1番目要素だけに読み込まれるわけです。


なお、1次元でも2次元でも3次元でも、コードはほとんど一緒です。

=== ファイルへの書き出し ===
    Dim F As Integer
    Dim X() As Byte
    
    ReDim X(2)
    X(0) = 0
    X(1) = 1
    X(2) = 2
    F = FreeFile()
    Open "C:\1次元.dat" For Binary As #F
    Put #F, , X
    Close #F

    ReDim X(2, 1)
    X(0, 0) = 0
    X(0, 1) = 1
    X(1, 0) = 10
    X(1, 1) = 11
    X(2, 0) = 20
    X(2, 1) = 21
    F = FreeFile()
    Open "C:\2次元.dat" For Binary As #F
    Put #F, , X
    Close #F

=== ファイルからの読み込み ===
    Dim F As Integer
    Dim X() As Byte
    Dim l As Long
    
    ReDim X(2)
    F = FreeFile()
    Open "C:\1次元.dat" For Binary As #F
    Get #F, , X
    Close #F
    For l = 0 To 2
        Debug.Print l; "="; X(l)
    Next

    ReDim X(2, 1)
    F = FreeFile()
    Open "C:\2次元.dat" For Binary As #F
    Get #F, , X
    Close #F
    For l = 0 To 2
        Debug.Print l; ",0="; X(l, 0), l; ",1="; X(l, 1)
    Next

投稿時間:2003/08/09(Sat) 19:22
投稿者名:shin
Eメール:
URL :
タイトル:
Re^7: 2次元配列で・・・
解答ありがとうございます〜
おかげさまで、やりたいことはなんとかなりそうです〜♪

わざわざお付き合い下さってありがとうございましたm(_ _)m

投稿時間:2003/08/09(Sat) 03:55
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^6: 2次元配列で・・・
> FileLen(fname(i))でファイルのサイズが取得出来てます〜

あ!、ごめんなさい。ぼけていました。