昨日固定長について質問させていただいた相原です。
なぜか質問した内容と頂いた回答がなくなってしまったのですが、
そういうことってありえるのでしょうか?
とにかくおかげさまで、その質問に関しては解決いたしました。
ありがとうございました。
しかし別件でまたエラーが出て悩んでいます。
Public Class Form1
Structure DataCell
<VBFixedArray(1)> Public a() As Byte
<VBFixedArray(1)> Public b() As Byte
<VBFixedArray(1)> Public c() As Byte
<VBFixedArray(1)> Public kaigyou() As Byte
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim I As Integer
Dim FileNum As Integer = FileSystem.FreeFile
FileSystem.FileOpen(FileNum, "c:\test.txt", OpenMode.Random, , , Len(New DataCell()))
Dim pos() As DataCell
I = 1
Do While Not EOF(FileNum)
ReDim pos(I)
FileSystem.FileGet(FileNum, pos(I - 1))
I = I + 1
Loop
End Sub
End Class
固定長を読み込む処理を行っているのですが、Option Strict On
をつけた場合、pos(I - 1)の部分で、
Option Strict On では、'ByRef' パラメータ 'Value' の値を、一致する引数に戻してコピーする際に、型 'System.ValueType' から
'WindowsApplication1.Form1.DataCell' に縮小変換することはできません。
というエラーが出てしまいます。
解決方法を教えていただけないでしょうか?
> なぜか質問した内容と頂いた回答がなくなってしまったのですが、
それは、貴方が昨日質問したのが、この
「Visual Basic Q & A掲示板」ではなく、隣の
「Visual Basic 初心者掲示板」だったからですけど・・・
(http://madia.world.coocan.jp/vb/index.html)
ヘルプに書いてあるように、解決方法は、
----------------------------------------------------------------
プロシージャ呼び出しで、宣言された型と同じデータ型を使用して各 ByRef 引数を指定するか、Option Strict Off にします。
----------------------------------------------------------------
ですね。
要するに、明示的に型変換(ValueTypeとDateCell間の型変換)が必要ってことですね。
例えば、
----------------------------------------------------------------
Dim o As ValueType
----------------------------------------------------------------
と言う、変数を用意しておいて、
----------------------------------------------------------------
' DataCell型からValueType型へ変換
o = CType(pos(I - 1), ValueType)
' ValueType型で読み込み
FileSystem.FileGet(FileNum, o)
' ValueType型からDataCell型へ変換
pos(I - 1) = CType(o, DataCell)
----------------------------------------------------------------
とするとか・・・
# おっと。回答を書いている間に、大吉末吉さんに先を越されてしまった。(^^;
# せっかく書いたので、差分部分だけでも投稿。
> 隣の「Visual Basic 初心者掲示板」だったからですけど・・・
具体的な投稿は、
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200701/07010054.txt
ですね。先の投稿に[解決]マークをつける事もお忘れなく。
>> ReDim pos(I)
配列確保時に Preserve していないので、これだと、
ループのたびに配列の内容がクリアされてしまいますよ。
それに、「ReDim pos(I)」しているのに、読み込ませるのが「pos(I - 1)」の
部分だけになっていますが、これだと、最後の「pos(I)」の領域が、
常に空のままになってしまいますよね。
ランダムアクセスの読み込みならば、ループ中に ReDim を幾度も発行するのではなく、
最初にファイルサイズを取得しておき、そこからレコード数を割り出して、
その分の配列要素をループ前に確保した方が、効率が良いかと思います。
# そうすれば、配列全体への一括読み込みもできますし。
> pos(I - 1) = CType(o, DataCell)
この場合は CType よりも、DirectCast の方が良いかも。
大吉末吉さん、魔界の仮面弁士さんありがとうございます。
いろいろとお手数をお掛けしました。
お二人のご指摘通り、DirectCastでキャストしたらうまいこと
いきました。
また、ReDimの件など、ご指摘頂き、大変助かりました。
まだまだ勉強不足なので、一生懸命頑張りたいと思います。
また、分からないことがありましたらご指導願います。
ツイート | ![]() |