tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル構造体配列の初期化
記事No10816
投稿日: 2012/05/22(Tue) 11:39
投稿者masa
以下の様に構造体に配列を定義しておりますが、実際に配列を使おうとすると
”オブジェクト参照がオブジェクト インスタンスに設定されていません”のメッセーじがでます。
恐らく何か不足していると思うのですが、何方かお願いします。

Public STR(0 To 32) As Type_Struct    
Public Structure Type_TM_Struct    
        Public ST1 As String        
        Public ST2() As String
        Public Sub Initialize()
            ReDim ST2(6)
        End Sub
End Structure

From_Load中に以下を指定
STR(0).st2(0)="test"  ←ここでエラー

VB2005+WinXP

[ツリー表示へ]
タイトルRe: 構造体配列の初期化
記事No10817
投稿日: 2012/05/22(Tue) 12:33
投稿者魔界の仮面弁士
> Public STR(0 To 32) As Type_Struct
> Public Structure Type_TM_Struct
Type_TM_Struct の宣言はありますが、
Type_Struct の宣言はどこでしょうか?

また、VB には標準で「Str 関数」というものがありますので、
「STR」という変数名を採用することはお奨めできません。


> のメッセーじがでます。
エラーの理由は、ST2 が Nothing の状態で、ST2(0) を操作しようとしたためですね。


> 恐らく何か不足していると思うのですが、何方かお願いします。
利用する前に、Initialize メソッドを呼び出すようにしてやれば OK です。
(このメソッドが、自動的に呼び出されることはありません)


また、配列の初期化を強制したい場合には、Structure の代わりに
Class を利用することを検討してみてください。

クラスであれば、フィールドメンバーの宣言を
 Public ST2(6) As String
のように記述することができます。

ただしクラスにした場合、利用側は (New Type_Struct() などで)
インスタンスを生成してから利用する必要があります。


上記の他、Class/Structure にコンストラクタ(Sub New)を作って
そこに Initialize 相当の初期化処理を組み込むという手もあります。
(Class と Structure では、「引数無しのコンストラクタ」の扱いが異なることに注意)

[ツリー表示へ]
タイトルRe^2: 構造体配列の初期化
記事No10819
投稿日: 2012/05/22(Tue) 13:38
投稿者masa
魔界の仮面弁士様

ありがとうございます。

> Type_Struct の宣言はどこでしょうか?
  Type_TM_Struct はType_Struct のあやまりでした。
> また、VB には標準で「Str 関数」というものがありますので、
> 「STR」という変数名を採用することはお奨めできません。
  ありがとうございます。

> また、配列の初期化を強制したい場合には、Structure の代わりに
> Class を利用することを検討してみてください。
 すみませんClassを理解していないのですが具体的にどの様に定義すれば
 よろしいのでしょうか。

[ツリー表示へ]
タイトルRe^3: 構造体配列の初期化
記事No10821
投稿日: 2012/05/22(Tue) 14:16
投稿者masa
Public Structure Type_Struct
を以下の様に変更し、その後に構造体の初期化をしてやることで上手くいきました
ありがとうございました。
    
Public Class Type_Struct    

[ツリー表示へ]