先程、同じ質問をしましたがあせっていてうまく質問が出来なかったので再度質問します。
ユーザ定義型における動的配列のファイルへの保存を行いたいのですがうまく行きません。
また、レングスも定義したサイズと異なります。
ユーザ定義型における動的配列は無理なのでしょうか?
回避方法等がありましたらおしえていただきたいのですがよろしくお願いします。
〜モジュール〜
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
ユーザー定義型を直接指定するのではなくて、いったんString型変数に格納
してから処理したらいいと思いますよ。
ご回答ありがとうございました。
大変申し訳ありませんが、”String型変数に格納してから処理したらいい”
ということはどういうことでしょうか?
申し訳ありませんが詳しく教えて下さい。
#回答ではないです
可変長で書き出すのはいいんですが
読み込むときはどうやって読み込むつもりなのですか?
それともファイルに書きっぱなしでよいのでしょうか?
それを解決しないと質問自体が無意味になってしまうような。
可変長で書き出したデータは、読み込みません。
ファイルに書きっぱなしにします。
大変申し訳ありません。
可変長で書き出したデータは読み込みます。
TP1Clientの関数で引数として使用することになっています。
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もその様な計算になっているんじゃないでしょうか。
あいうえおにぎりさんご返答ありがとうございます。
前回質問した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を取り除いた場合、静的配列で関数発行を定義しているデー タは、「構造体を定義しているデータ」は付きませんでした。
自分で好きなように書式を整えてファイルに書き出してやればいいだけじゃ
ないですか?
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
と書き出されます。