ユーザ定義型における動的配列について2


たか  2004-09-16 14:12:36  No: 85593  IP: [192.*.*.*]

先程、同じ質問をしましたがあせっていてうまく質問が出来なかったので再度質問します。
ユーザ定義型における動的配列のファイルへの保存を行いたいのですがうまく行きません。
また、レングスも定義したサイズと異なります。
ユーザ定義型における動的配列は無理なのでしょうか?
回避方法等がありましたらおしえていただきたいのですがよろしくお願いします。
〜モジュール〜
Type eee
    Kotei4   As String * 3
    Kotei5   As String * 3
End Type

Type ddd
    Kotei1   As String * 1
    Kotei2   As String * 1
    Kotei3() As eee
End Type

Type bbb
    ccc      As ddd
End Type
Global aaa As bbb

〜フォーム〜
Private Sub Form_Load()

    ReDim aaa.ccc.Kotei3(1)
    With aaa.ccc
        .Kotei1 = "1"
        .Kotei2 = "2"
        .Kotei3(0).Kotei4 = "123"
        .Kotei3(0).Kotei5 = "456"
        .Kotei3(1).Kotei4 = "789"
        .Kotei3(1).Kotei5 = "012"
    End With

    Length = Len(aaa)    ---> レングスは、14のはずだがなぜか6となる。

    Open "c:\abc\TESTFILE.txt" For Binary As #1
        Put #1, , aaa    --->  ゴミらしき値が出力されている。  
    Close #1

End Sub

編集 削除
あいうえおにぎり  2004-09-16 15:22:47  No: 85594  IP: [192.*.*.*]

ユーザー定義型を直接指定するのではなくて、いったんString型変数に格納
してから処理したらいいと思いますよ。

編集 削除
たか  2004-09-16 15:37:17  No: 85595  IP: [192.*.*.*]

ご回答ありがとうございました。
大変申し訳ありませんが、”String型変数に格納してから処理したらいい”
ということはどういうことでしょうか?
申し訳ありませんが詳しく教えて下さい。

編集 削除
ふらっと  2004-09-16 16:00:28  No: 85596  IP: [192.*.*.*]

#回答ではないです

可変長で書き出すのはいいんですが
読み込むときはどうやって読み込むつもりなのですか?
それともファイルに書きっぱなしでよいのでしょうか?
それを解決しないと質問自体が無意味になってしまうような。

編集 削除
たか  2004-09-16 16:26:45  No: 85597  IP: [192.*.*.*]

可変長で書き出したデータは、読み込みません。
ファイルに書きっぱなしにします。

編集 削除
たか  2004-09-16 17:06:16  No: 85598  IP: [192.*.*.*]

大変申し訳ありません。
可変長で書き出したデータは読み込みます。
TP1Clientの関数で引数として使用することになっています。

編集 削除
ふらっと  2004-09-16 17:42:59  No: 85599  IP: [192.*.*.*]

Putで書き出したものはGetで読み込むことができますが
たかさんのイメージではファイルに
1
2
123
456
789
012
または
12123456789012
と書かれていなければならないような印象を受けたので読み込むときの
方法を質問したわけです。
なぜ、このように思ったかといいますと「ゴミらしき値が出力されている。」
との記述があったので、テキストのみが欲しいのかと推測したわけです。

ゴミと思われる部分は構造体を定義している部分でこれがないとGetで
正確に読み取る事ができなくなります。
上記方法でPutしたものをGetで取得できなかったですか?

あとLenですが、C言語をかじったことがあれば分かると思うのですが
typedef struct 
{
 char kotei1[1];
 char kotei[1];
 eee  kotei3[];
} MyType
とするとkotei3に後から動的にメモリを割当ててもMyTypeのサイズは6バイトのままです。
おそらくLenもその様な計算になっているんじゃないでしょうか。

編集 削除
たか  2004-09-21 15:22:44  No: 85600  IP: [192.*.*.*]

あいうえおにぎりさんご返答ありがとうございます。
前回質問したVBのソース例が悪くすべてString型変数の定義となっていましたが
Byte型変数も必要とするためString型変数に格納することが出来ません。

ふらっとさんご回答ありがとうございます。
ゴミと思っていた部分は「構造体を定義しているデータ」である事が理解できました。
API関数のレイアウトの制限で「構造体を定義しているデータ」を取り除いたレイアウトでデータを送りたいのですが解決方法はあるでしょうか?

API関数レイアウト
項目    サイズ 属性
-------  ----  ----
Kotei1    1     B
kotei2    n         →  繰り返し(※1参照)

※1
kotei3    3     C
Kotei4    1     B

上記レイアウトでAPI関数の発行を実施したいが、VB側のパラメータで動的配列を使用すると、
次のデータの様なレイアウトでデータを引き渡してしまいます。"0・ ・       123412341234"(動的配列が3の場合)
API関数発行の際のデータは、"0123412341234"(動的配列が3の場合)としたいのですがどうすれば可能でしょうか?
前提
  配列(Kotei2(n))は、動的に決定する。
  API側の関数のパラメータのレイアウトは変更できません。
  
以下VBのソース
〜標準モジュール〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Type eee
    Kotei3   As String * 3
    Kotei4   As byte
End Type
Type ddd
    Kotei1   As byte
    Kotei2() As eee
End Type
Global aaa As ddd
〜フォーム〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Private Sub Form_Load()
    ReDim aaa.Kotei2(n)
    With aaa
        .Kotei1 = 0
        For i = 0 to n
            .Kotei2(i).Kotei3 = "123"
            .Kotei2(i).Kotei4 = 4
        Next i 
    End With
End Sub

補足
  Kotei2(n)としRedimを取り除いた場合、静的配列で関数発行を定義しているデー  タは、「構造体を定義しているデータ」は付きませんでした。

編集 削除
ABC  2004-09-21 22:34:47  No: 85601  IP: [192.*.*.*]

自分で好きなように書式を整えてファイルに書き出してやればいいだけじゃ
ないですか?
Putで一発で吐き出そうとせずにPrintとかを使って希望するフォーマットで
ファイルに書き出してはどうでしょう。

    ReDim aaa.ccc.Kotei3(1)
    With aaa.ccc
        .Kotei1 = "1"
        .Kotei2 = "2"
        .Kotei3(0).Kotei4 = "123"
        .Kotei3(0).Kotei5 = "456"
        .Kotei3(1).Kotei4 = "789"
        .Kotei3(1).Kotei5 = "012"
    End With

の場合
 With aaa.ccc
   Print #intF,.Kotei1
   Print #intF,.Kotei2
   For i=0 To UBound(.Kotei3)
     Print #intF,.Kotei3(i).Kotei4
     Print #intF,.Kotei3(i).Kotei5
   Next
 End With
でファイルには
1
2
123
456
789
012
と書き出されます。

編集 削除