- PR -

Arraylist と 構造体について

投稿者投稿内容
みー助
会議室デビュー日: 2005/04/14
投稿数: 5
投稿日時: 2005-04-14 13:11
はじめて投稿します。

.NET VBで開発しています。
構造体宣言の中にArraylistを宣言して、代入するとエラーになってしまいます。

Public AList As New ArrayList
Public Structure tSt
dim a as String
dim b as ArrayList
End Structure
Public tpSt As tSt

sub Test()
tpSt.a = "ABC"
AList.Add(tpSt)

ある処理

AList(0).b.Add("123") ←ここでエラー・・・
end sub

私なりに調べたのですが、わからなかったので、よろしくお願いします。

NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-04-14 13:21
Structureの中にある、ArrayListのインスタンスが存在しないから。

#例外の内容をちゃんと見ました?
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-04-14 13:23
dim b as ArrayList をNewしてないからなのでは?
というか、最低エラーの内容ぐらい書きましょう。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-04-14 13:31
>エラーになってしまいます

どうした時にどうなるか具体的に書くと返答が早く多くもらえると思いますよ。

みー助さんの書いたソースが全てだとすると、NAL-6295さんのおっしゃるようにNullReferenceExceptionでしょうね。
"AList(0).b"がNothingということです。

みー助
会議室デビュー日: 2005/04/14
投稿数: 5
投稿日時: 2005-04-14 13:35
すいません。エラー内容がなかったです。
-----------------------------------------------------------------------
'System.NullReferenceException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。

追加情報 : オブジェクト変数または With ブロック変数が設定されていません。
-----------------------------------------------------------------------

dim b as New ArrayList
とすると構造体メンバをNewとして宣言できません。
になってしまいます。

どのようにインスタンスを作るのでしょうか?
.NET初めて4日目で苦労しています。。。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-04-14 13:51
そんなの、コンストラクタで生成すれば良いよ。←ある意味間違い

#追記
あうち、間違えてた・・・
宣言した後に、ArrayListを生成してあげればよいと思いますよ。
ただ、多分、このメンバ構成の場合はClassにした方が適切だと思います。
Structureの場合インスタンスコンストラクタは引数無しだと定義できません。

#追記

というか、StructureとClassの違いは把握していますか?

引用:

.NET初めて4日目で苦労しています。。。



そりゃ、勉強しないで作ってれば苦労するよ。
リファレンスとか読みましょうよ。


_________________
一つ理解するたびに、一つあなたは楽になる。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-04-14 13:52 ]


[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-04-14 14:15 ]
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-04-14 13:54
宣言に関して
1.Dim b As ArrayList
2.Dim b As Object
3.Dim b As new ArrayList

うろ覚えで書いてますが、
もしかしたら3番のケースが駄目なのかもしてません。

Set b = new ArrayList
宣言の次の行に上のセット文書いたら収まりませんでしょうか?

エラーの可能性ですが、
VB6での話ですので関係ないかもしれませんが、
構造体の中に構造体を埋め込むと
動的になる要素が多すぎて
メモリの量が用意できなくなるから勘弁してくれ・・・・
というエラーに直面したことがあります。
その手の類なのかもしれません。

この場合
ArrayListを収める変数にn件までしか使わないよって言う明示的な宣言を
用意するとうまくいくかもしれません。

あくまで可能性の話です。
関係なかったらごめんなさい。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-04-14 14:12
引用:

るぱんさんの書き込み (2005-04-14 13:54) より:
もしかしたら3番のケースが駄目なのかもしてません。



いや、構造体は初期化子は書けないはずです。
引数のないコンストラクタもプログラマが書くことはできません。
つまり、全てのフィールドが初期値の状態の構造体をnewすることが必ず出来るような仕組みになっています。(構造体なのでnewとは書きませんが)

引用:

みー助さんの書き込み (2005-04-14 13:35) より:
.NET初めて4日目で苦労しています。。。


4日目だから苦労しているんですよね。本を読んだりプログラムを作ったりしていれば慣れてきますよ。
ちなみに.NETを勉強するのならVB.NETよりC#の方が何かと好ましいと思います。
会社の研修で、VB.NETと決められているなら仕方がないですけど。
VB.NETでも、少なくともOption StrictはOnにしておきましょう。

VB2005になったら、Myとかいう機能が付くみたいで、
後「先輩、この子画面をShow()できません。」
先「インスタンスを作ってないからだろ。」
後「インスタンス?ああ、聞いたことありますね。何ですか、それ?」

とか言われる悪寒

スキルアップ/キャリアアップ(JOB@IT)