動的配列の警告

タグの編集
投稿者 nagasaqa  () 投稿日時 2008/2/26 23:34:00
VB2003 では、配列数を確保しないで、SUBを呼び出して、データ分だけの配列を勝手に確保してくれましたが、2005では、警告が出ます。(値が渡される前に参照によって呼び出されています~) 
どのように回避したらよいでしょうか。教えてください。 
Private Sub Butload_Click( 略 ) Handles Butload.Click 
        Dim backdata() As String'動的配列定義 
        subLoadfile(filenam, backdata)’subに渡す 
        If IsNothing(backdata) Then 
            Exit Sub 
        End If 
End Sub 
 
Private Sub subLoadfile(ByVal fname As String, ByRef dataline As String()) 
        Dim fstream As New IO.StreamReader(fname, System.Text.Encoding.Default) 
        dataline = fstream.ReadLine.Split(","c)’ここで配列数が決まる。 
        fstream.Close() 
End Sub
投稿者 魔界の仮面弁士  () 投稿日時 2008/2/27 00:07:00
> 値が渡される前に参照によって呼び出されています 
こういう時には、メソッドの実装を 
 Sub subLoadfile(ByVal fname As String, ByRef dataline As String()) 
にするのではなく、 
 Function LoadFile(ByVal fname As String) As String() 
にした方が良いでしょう。 
 
そして、 
 Dim backdata() As String = LoadFile(backdata) 
のようにすれば、エラーも出ないはずです。 
 
 
どうしても ByRef で処理したいのであれば、 
 Dim backdata(-1) As String 
もしくは、 
 Dim backdata() As String = {} 
のように、「長さゼロの配列」を入れておくか、または 
 Dim backdata() As String = Nothing 
などとしておけば、警告は消えます。 
 
(つまり、使う前に何でも良いから値を入れておくということ) 
 
 
もしくは、コンパイルオプションの「割り当て前の変数の使用」を 
[警告]から[なし]に切り替えて運用するという方法もあります。
投稿者 魔界の仮面弁士  () 投稿日時 2008/2/27 00:15:00
>>1 
> Dim backdata() As String = LoadFile(backdata)  
失礼しました。正しくは 
 Dim backdata() As String = LoadFile(filenam)  
ですね。
投稿者 nagasaqa  () 投稿日時 2008/2/29 09:12:00
>>2 
ありがとうございました。そうやってきちっとしたプログラムを書かないといけないのですね。 
大変参考になりました。