DOBON.NET DOBON.NETプログラミング掲示板過去ログ

構造体配列?の初期化

環境/言語:[Win2000 VB.net]
分類:[.NET]

すみません。質問させてください。

下記コードを実行するとオブジェクト参照がオブジェクトインスタンスに設定されていません。
エラーとなります。

よろしければ、教えてくれると幸いです。(ソースみずらくてスミマセン。)

'宣言

Public AAAA As BBBB

Public Structure CCCC
Dim DDDD As Short
Dim EEEE As Short
End Structure

Public Structure BBBB
<VBFixedArray(255)> Dim FFFF() As CCCC

Public Sub Initialize()
ReDim FFFF(255)
End Sub
End Structure


'初期化
Public Sub Syokika()
Try
Dim iCount As Short

For iCount = 0 To 255
AAAA.FFFF(iCount).DDDD = 0
AAAA.FFFF(iCount).EEEE = 0
Next iCount
Catch ex As Exception
MsgBox("エラーとなる・・" & vbCrLf & ex.Message)

End Try
End Sub
こんにちは、じゃんぬ です。

■No11235に返信(saiさんの記事)
> 下記コードを実行するとオブジェクト参照がオブジェクトインスタンスに設定されていません。

ヒント : 配列の初期化とインスタンス化は別物。
早い返信ありがとうございます。 じゃんぬねっとさんm(_ _)m

> ヒント : 配列の初期化とインスタンス化は別物。

配列を初期化しようと思っていて、エラーとなるので、書かせていただきました。

上記ヒントだと、インスタンスを生成してないので、エラーとなるということでしょうか?
Syokika関数内で、インスタンスを生成すればいいのかな。。

的ハズレナ答えだったらすみません。よろしくお願いします。
>>ヒント : 配列の初期化とインスタンス化は別物。
> 配列を初期化しようと思っていて、エラーとなるので、書かせていただきました。

 私が勘違いしてるのかも知れませんけれど‥‥

 ここで問題になっているのはそもそも『配列の初期化がされていない』ことではないでしょうか? BBBB.Initialize メソッド、(少なくともご提示されてるコード上では)呼ばれてませんよね?
# CCCC はクラスではなく構造体なので、この場合影響なかったような?



(余談)
> (ソースみずらくてスミマセン。)

 投稿する際[図表モード]を選択して頂ければ見易くなりますよ。
#って、そういう意味じゃなかったのかも(汗)
返信ありがとうございます。 深山さん

>BBBB.Initialize メソッド、(少なくともご提示されてるコード上では)呼ばれてませんよね?

上記コードでは、よばれませんか。。
なので、
上記コードでは、AAAA.FFFF(iCount)が初期化されていないので、
AAAA.FFFF(iCount).DDDDを参照しようとして、
エラーとなるのでしょうか?

参照する所がまったく無知なので、勉強しようと思いますが、すみません。
よろしくお願いします。
たびたびすみません。

確かにInitializeが呼ばれていないので、下記修正をしました。

'宣言

Public AAAA As BBBB

Public Structure CCCC
Dim DDDD As Short
Dim EEEE As Short
End Structure

Public Structure BBBB
<VBFixedArray(255)> Dim FFFF() As CCCC

Public Sub Initialize()
ReDim FFFF(255)
End Sub
End Structure


'初期化
Public Sub Syokika()
Try
Dim iCount As Short
Dim InitializeColl as BBBB
InitializeColl.Initialize()

For iCount = 0 To 255
AAAA.FFFF(iCount).DDDD = 0
AAAA.FFFF(iCount).EEEE = 0
Next iCount
Catch ex As Exception
MsgBox("エラーとなる・・" & vbCrLf & ex.Message)

End Try
End Sub

これでとりあえず、初期化はできてると思うのですが、
以前、オブジェクト参照がオブジェクトインスタンスに設定されていません
と、でるので、やはり、インスタンス化に問題があるのでしょうか。

記述忘れましたが、宣言部分は、モジュールによって行っています。スミマセン。

いろいろと考えてみます。
何度もすみません。m(_ _)m
本当たびたびスミマセン。

以下のようにやって確認できました。。
知識不足ですね。。うまくインスタンスが生成できていなかった為だと思われます。
VBあがりなので、オブジェクト指向がよくわかりませんので、
勉強していこうと思います。。

'宣言

Public AAAA As BBBB

Public Structure CCCC
Dim DDDD As Short
Dim EEEE As Short
End Structure

Public Structure BBBB
<VBFixedArray(255)> Dim FFFF() As CCCC

Public Sub Initialize()
ReDim FFFF(255)
End Sub
End Structure


'初期化
Public Sub Syokika()
Try
Dim iCount As Short
Dim AAAA as BBBB
AAAA.Initialize()

For iCount = 0 To 255
AAAA.FFFF(iCount).DDDD = 0
AAAA.FFFF(iCount).EEEE = 0
Next iCount
Catch ex As Exception
MsgBox("エラーとなる・・" & vbCrLf & ex.Message)

End Try
End Sub

おそらく、上記でいいと思うのですが、ツッコミ所あったら、お願いします。

いろいろとありがとうございました。m(_ _)m
げ、解決押し忘れました。
たびたび、スミマセン。
解決済み!
■No11245に返信(saiさんの記事)
> げ、解決押し忘れました。
> たびたび、スミマセン。
ん…解決しているように見えるけど。
"Public AAAA"とSub Syokika()の"Dim AAAA"があるので、
ローカルなスコープのAAAAのInitialize()しか呼ばれていないような希ガス…

※気のせい…?
2005/06/13(Mon) 13:22:23 編集(投稿者)

> おそらく、上記でいいと思うのですが、ツッコミ所あったら、お願いします。
> Public AAAA As BBBB
(中略)
> Public Sub Syokika()
> Try
> Dim iCount As Short
> Dim AAAA as BBBB
(後略)

 えーっと‥‥最初に Public で宣言している AAAA と、 Syokika メソッド内で宣言している AAAA は別物になってしまいますよ?(^_^;)
 他のメソッド内で AAAA の中身を確認してみてください。意図した初期化がされていないと思います。


> VBあがりなので、オブジェクト指向がよくわかりませんので、
> 勉強していこうと思います。。

 VB6 以前のプログラミング経験はあるということでしょうか? でしたら次のサイトなど参考になるかも知れません。

改訂版 プロフェッショナルVB.NETプログラミング
−VB 6プログラマーに贈るVisual Basic .NET講座−
http://www.atmarkit.co.jp/fdotnet/vb6tonet2/index/index.html



#あぅ、更新し忘れてた‥‥(///)<かぶった
■No11246に返信(ガッさんの記事)
> ■No11245に返信(saiさんの記事)
>>げ、解決押し忘れました。
>>たびたび、スミマセン。
> ん…解決しているように見えるけど。
> "Public AAAA"とSub Syokika()の"Dim AAAA"があるので、
> ローカルなスコープのAAAAのInitialize()しか呼ばれていないような希ガス…
>
> ※気のせい…?
ガッ様、深山様 突っ込みありがとございます。。。

>えーっと‥‥最初に Public で宣言している AAAA と、 Syokika メソッド内で宣言し>ている AAAA は別物になってしまいますよ?(^_^;)
> 他のメソッド内で AAAA の中身を確認してみてください。意図した初期化がされてい>ないと思います。

>"Public AAAA"とSub Syokika()の"Dim AAAA"があるので、
>ローカルなスコープのAAAAのInitialize()しか呼ばれていないような希ガス…

まさに、その通り。。。。グローバルで宣言してる意味が。。。。
ってことで、Initialize()を呼ぶだけで、よかったんですね。。

宣言

Public AAAA As BBBB

Public Structure CCCC
Dim DDDD As Short
Dim EEEE As Short
End Structure

Public Structure BBBB
<VBFixedArray(255)> Dim FFFF() As CCCC

Public Sub Initialize()
ReDim FFFF(255)
End Sub
End Structure


'初期化
Public Sub Syokika()
Try
Dim iCount As Short
AAAA.Initialize()

For iCount = 0 To 255
AAAA.FFFF(iCount).DDDD = 0
AAAA.FFFF(iCount).EEEE = 0
Next iCount
Catch ex As Exception
MsgBox("エラーとなる・・" & vbCrLf & ex.Message)

End Try
End Sub

最初上記修正でエラーがでたのですが、
今実行すると通ります。。お騒がせしました。。

皆様ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板