C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 構造体 参照メンバの初期化


(過去ログ 33 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■16495 / inTopicNo.1)  構造体 参照メンバの初期化
  
□投稿者/ VBビギナー (2回)-(2008/04/07(Mon) 12:07:59)

分類:[VB.NET/VB2005] 

開発環境 Microsoft Visual Basic 2005

下記、警告を解消する方法をご教授願います。
『変数'typData'は、値が割り当てられる前に参照によって使用されています。Null参照の例外が実行時に発生する可能性があります。
構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。』


下記に処理の内容を記述します。
(構造体にて宣言している変数にファイルから読み出したデータを格納する処理です。)


//構造体の宣言//
Private Structure DATA_TYPE
Dim bytAAA As Byte
Dim bytBBB As Byte
<VBFixedArray(5)> Dim bytCCC() As Byte
<VBFixedArray(1)> Dim bytDDD() As Byte
End Structure

//関数//
Public Function sbTest()

'変数宣言
Dim typData As DATA_TYPE
Dim TempData As System.ValueType = DATA_TYPE←ここで警告が出ます

'ファイルオープン
GetFileNum = FreeFile()
FileSystem.FileOpen(GetFileNum, ファイル名, OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)

'データを取得する
FileSystem.FileGet(GetFileNum, TempData, 1)

'一時的に格納したデータを復元
typHeadData = DirectCast(TempData, UCRHEAD_TYPE)


 ・

 ・

End Function
引用返信 編集キー/
■16497 / inTopicNo.2)  Re[1]: 構造体 参照メンバの初期化
□投稿者/ ネタ好き (43回)-(2008/04/07(Mon) 12:24:02)
DATA_TYPE構造体が初期化されていないから発生する警告です。
使用前にちゃんと初期化してください。
引用返信 編集キー/
■16504 / inTopicNo.3)  Re[2]: 構造体 参照メンバの初期化
□投稿者/ VBビギナー (3回)-(2008/04/07(Mon) 13:07:58)
No16497 (ネタ好き さん) に返信
> DATA_TYPE構造体が初期化されていないから発生する警告です。
> 使用前にちゃんと初期化してください。

DATA_TYPE構造体の初期化が方法は、どのようなやり方が
ベストなのでしょうか?メンバが配列を持っている場合は特に。



引用返信 編集キー/
■16517 / inTopicNo.4)  Re[3]: 構造体 参照メンバの初期化
□投稿者/ ネタ好き (46回)-(2008/04/07(Mon) 17:17:22)
No16504 (VBビギナー さん) に返信
> ■No16497 (ネタ好き さん) に返信
>>DATA_TYPE構造体が初期化されていないから発生する警告です。
>>使用前にちゃんと初期化してください。
>
> DATA_TYPE構造体の初期化が方法は、どのようなやり方が
> ベストなのでしょうか?メンバが配列を持っている場合は特に。
>
>
>


Dim TempData As System.ValueType = DirectCast(New DATA_TYPE(), System.ValueType)では駄目ですか?
引用返信 編集キー/
■16519 / inTopicNo.5)  Re[1]: 構造体 参照メンバの初期化
□投稿者/ Jitta on the way (72回)-(2008/04/07(Mon) 18:07:44)
No16495 (VBビギナー さん) に返信
> 開発環境 Microsoft Visual Basic 2005
>
> 下記、警告を解消する方法をご教授願います。
> 『変数'typData'は、値が割り当てられる前に参照によって使用されています。Null参照の例外が実行時に発生する可能性があります。
> 構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。』
>
>
> 下記に処理の内容を記述します。
> (構造体にて宣言している変数にファイルから読み出したデータを格納する処理です。)
>
>
> //構造体の宣言//
> Private Structure DATA_TYPE
> Dim bytAAA As Byte
> Dim bytBBB As Byte
> <VBFixedArray(5)> Dim bytCCC() As Byte
> <VBFixedArray(1)> Dim bytDDD() As Byte
> End Structure
>
> //関数//
> Public Function sbTest()
>
> '変数宣言
> Dim typData As New DATA_TYPE ←実はここ
> Dim TempData As System.ValueType = DATA_TYPE←ここで警告が出ます←実は違う
>
> 'ファイルオープン
> GetFileNum = FreeFile()
> FileSystem.FileOpen(GetFileNum, ファイル名, OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)
>
> 'データを取得する
> FileSystem.FileGet(GetFileNum, TempData, 1)
>
> '一時的に格納したデータを復元
> typHeadData = DirectCast(TempData, UCRHEAD_TYPE)
>
> ・
>  ・
> ・
>  ・
>
> End Function
引用返信 編集キー/
■16536 / inTopicNo.6)  Re[2]: 構造体 参照メンバの初期化
□投稿者/ VBビギナー (4回)-(2008/04/07(Mon) 21:26:36)
投稿者/ ネタ好き (46回)-(2008/04/07(Mon) 17:17:22)

No16504 (VBビギナー さん) に返信
> ■No16497 (ネタ好き さん) に返信


>Dim TempData As System.ValueType = DirectCast(New DATA_TYPE(), System.ValueType)では駄目ですか?

”DirectCast(New DATA_TYPE(), System.ValueType)”で構造体を初期化宣言してやれば、
警告が消えました。

ありがとうございます。


引用返信 編集キー/
■16544 / inTopicNo.7)  Re[3]: 構造体 参照メンバの初期化
□投稿者/ もんきっき (21回)-(2008/04/07(Mon) 23:37:15)
横レス申し訳ありません。

「”DirectCast(New DATA_TYPE(), System.ValueType)”で構造体を初期化宣言」してやると
「Null参照の例外が実行時に発生する可能性」はなくなるのですか?

これは単に警告が消えるだけ?
それとも例外が発生する可能性がなくなったのでしょうか?


引用返信 編集キー/
■16550 / inTopicNo.8)  Re[4]: 構造体 参照メンバの初期化
□投稿者/ ネタ好き (48回)-(2008/04/08(Tue) 00:19:03)
2008/04/08(Tue) 00:24:43 編集(投稿者)

No16544 (もんきっき さん) に返信
> 横レス申し訳ありません。
>
> 「”DirectCast(New DATA_TYPE(), System.ValueType)”で構造体を初期化宣言」してやると
> 「Null参照の例外が実行時に発生する可能性」はなくなるのですか?
>
> これは単に警告が消えるだけ?
> それとも例外が発生する可能性がなくなったのでしょうか?
>
>

DirectCastは暗黙的な変換を防がないから、その辺で例外が発生する可能性はあります。
ただその場合は、暗黙の変換がある事自体が危険信号ですので、
構造体を見直した方がいいかもしれません。
それが予期した動作ならば、CTypeに変更すればよいでしょう。
なお、Null参照についてはいつでも発生する可能性はあります。
その場合はアルゴリズム的なミスなので、ちゃんとプログラムの流れを見直しましょう。

追記:
構造体のメンバを見るに、普通にやっている限りはNull参照にならないと思います。
参照型変数にボックス化した構造体の参照を代入し、その参照型変数をNullに設定するなどの無茶をしない限りまずNullにはなりません。
引用返信 編集キー/
■16627 / inTopicNo.9)  Re[5]: 構造体 参照メンバの初期化
□投稿者/ Jitta (462回)-(2008/04/08(Tue) 23:03:09)
どうして Microsoft.VisualBasic 名前空間を使うのだろう?というのはおいておくとして。

たぶん、DirectCast は要らないと思う。

> 『変数'typData'は、値が割り当てられる前に参照によって使用されています。Null参照の例外が実行時に発生する可能性があります。
> 構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。』

ですよね?ということは、

> '変数宣言
> Dim typData As DATA_TYPE
> Dim TempData As System.ValueType = DATA_TYPE←ここで警告が出ます

ここが、本当は、

> '変数宣言
> Dim typData As DATA_TYPE
> Dim TempData As System.ValueType = typData

だったんじゃないですか?
ってことで、

-----
'変数宣言
Dim typData As New DATA_TYPE

'ファイルオープン
GetFileNum = FreeFile()
FileSystem.FileOpen(GetFileNum, ファイル名, OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)

'データを取得する
' http://msdn2.microsoft.com/ja-jp/library/yf2cta70.aspx
FileSystem.FileGet(GetFileNum, typData, 1)

'一時的に格納したデータを復元
typHeadData = DirectCast(typData, UCRHEAD_TYPE)
-----
TempData が要らず、typData を New するようにして TempData から置き換えればいいと思います。
「FileSystem::FileGet(Int32, ValueType, Int64)」なので、Type を渡す必要はなく、データを読み込むための領域を渡してやれば OK です。

引用返信 編集キー/
■16630 / inTopicNo.10)  Re[6]: 構造体 参照メンバの初期化
□投稿者/ ネタ好き (58回)-(2008/04/08(Tue) 23:23:31)
No16627 (Jitta さん) に返信
> どうして Microsoft.VisualBasic 名前空間を使うのだろう?というのはおいておくとして。
>
> たぶん、DirectCast は要らないと思う。
>
>>『変数'typData'は、値が割り当てられる前に参照によって使用されています。Null参照の例外が実行時に発生する可能性があります。
>>構造体、またはすべての参照メンバが使用前に初期化されていることを確認してください。』
>
> ですよね?ということは、
>
>>'変数宣言
>>Dim typData As DATA_TYPE
>>Dim TempData As System.ValueType = DATA_TYPE←ここで警告が出ます
>
> ここが、本当は、
>
>>'変数宣言
>>Dim typData As DATA_TYPE
>>Dim TempData As System.ValueType = typData
>
> だったんじゃないですか?
> ってことで、
>
> -----
> '変数宣言
> Dim typData As New DATA_TYPE
>
> 'ファイルオープン
> GetFileNum = FreeFile()
> FileSystem.FileOpen(GetFileNum, ファイル名, OpenMode.Binary, OpenAccess.Read, OpenShare.LockWrite)
>
> 'データを取得する
> ' http://msdn2.microsoft.com/ja-jp/library/yf2cta70.aspx
> FileSystem.FileGet(GetFileNum, typData, 1)
>
> '一時的に格納したデータを復元
> typHeadData = DirectCast(typData, UCRHEAD_TYPE)
> -----
> TempData が要らず、typData を New するようにして TempData から置き換えればいいと思います。
> 「FileSystem::FileGet(Int32, ValueType, Int64)」なので、Type を渡す必要はなく、データを読み込むための領域を渡してやれば OK です。
>

いやぁ、始め私もそう思って迷ったのですが、
一々別変数にしているところに何かあるなーと思って、ああいう形にしてみました。
引用返信 編集キー/
■16696 / inTopicNo.11)  Re[7]: 構造体 参照メンバの初期化
□投稿者/ Jitta on the way (79回)-(2008/04/09(Wed) 18:18:01)
No16630 (ネタ好き さん) に返信

> いやぁ、始め私もそう思って迷ったのですが、

はい。なので、私も「たぶん」と。

学んでちょうだい>質問者
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -