Option Strict Onについて

解決


相原  2007-01-24 17:36:24  No: 97737

昨日固定長について質問させていただいた相原です。
なぜか質問した内容と頂いた回答がなくなってしまったのですが、
そういうことってありえるのでしょうか?
とにかくおかげさまで、その質問に関しては解決いたしました。
ありがとうございました。
しかし別件でまたエラーが出て悩んでいます。

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' に縮小変換することはできません。  
というエラーが出てしまいます。
解決方法を教えていただけないでしょうか?


大吉末吉  2007-01-24 19:03:50  No: 97738

> なぜか質問した内容と頂いた回答がなくなってしまったのですが、

それは、貴方が昨日質問したのが、この
「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)
----------------------------------------------------------------
とするとか・・・


魔界の仮面弁士  2007-01-24 19:18:04  No: 97739

# おっと。回答を書いている間に、大吉末吉さんに先を越されてしまった。(^^;
# せっかく書いたので、差分部分だけでも投稿。

> 隣の「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 の方が良いかも。


相原  2007-01-25 02:26:25  No: 97740

大吉末吉さん、魔界の仮面弁士さんありがとうございます。
いろいろとお手数をお掛けしました。
お二人のご指摘通り、DirectCastでキャストしたらうまいこと
いきました。
また、ReDimの件など、ご指摘頂き、大変助かりました。
まだまだ勉強不足なので、一生懸命頑張りたいと思います。
また、分からないことがありましたらご指導願います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加