アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB.net 2010 の質問です。

配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。


Dim Hairetsu() As String ' ←エラー
Dim Hairetsu(100) As String ' ←正常


Public Sub aaa(ByRef Hairetsu() As String)

Hairetsu(0) = "Test" '←正常の場合と、エラーの場合

End Sub


Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、
プログラム中、要素数がどこまで増加するか、分かりません。
Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。


ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

A 回答 (2件)

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。


http://msdn.microsoft.com/ja-jp/library/dd314345 …
特に
> 3-3-3 参照型としての配列変数
から下をよく読んで理解してください。


> Dim Hairetsu() As String

は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。
上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。
この図の「配列の実体」が最初から存在しない、というものです。


> Public Sub aaa(ByRef a() As String)
> a(0) = "Test" '←正常の場合と、エラーの場合

※ 念の為、仮引数の名前を変えました。

このsubを aaa(Hairetsu) と呼び出した場合、 Hairetsu() しただけの場合は、a = Nothing となっています。
よって、 a(0) は Nothing(0) ということになり、そんなものは無いのでエラーになります。

※ エラーメッセージはちゃんと読みましょう。
※ 質問するなら、ただ「エラーになります」では対処しようがありません。
※ 正確なエラーメッセージを記載るようにしましょう。
※ 例えば、そのエラーは
※ 「 NullReferenceException "オブジェクトのインスタンスを指定する必要がある部分に null 値が指定されています" 」
※ とか表示されていませんでしたか?



対策ですが、いくつもあるので、目的によって選択することになります。
○ aaa内で Nothingだったら処理を中止するようなコードにする
例) if a is Nothing then exit sub
○呼び出し元で、Hairetuをredimしてからaaaを呼び出す。
○aaa内でredim する。仮引数aはByRefになっているので、呼び出し元の変数が変更される。
 ※ なお、参照型の特性として「a(0) = "Test" 」だけなら、ByVal a でも同じ「配列の実体」にアクセスすることになります。
○ sub aaaではなく、 function aaa() as String() 等といった配列も返す関数にする
○ List(of T) 等の可変長で配列っぽく使えるクラスを使う
    • good
    • 0
この回答へのお礼

kmee様

配列の基礎が学べる、良いアドバイスをいただき有難うございます。

是非、参考にさせて頂きます。

お礼日時:2015/01/21 11:01
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A