- ベストアンサー
VB2008: 構造体と関数との関係?
VB.Net を知って60日余という初学者です。 やっと、構造体の基本事項の確認まで辿り着きました。 で、構造体と関数の関係をテスト。 結果、「関数に構造体全体を渡す場合には、たとえモジュールレベルの変数として宣言してモジュールレベルだけで用いるとしても Public で広域な変数として宣言しなければならない」ことが判明しました。 このことに関しての個人的な見解は次のようです。 >「関数のパラメータの型に用いる構造体等は全て Public で宣言されることで公開されていなければならない。 >関数がどういう型を受け取って、どのように演算し、いかなる型の値として戻すかは公開されていてこそ判断できる。 つまり、「関数の内々の事情、関数の約束事からの Public 宣言であって、構造体の通用範囲を広域にするためのそれではない」というのが私の理解。 問題は、MSDN ライブラリでこの理解の裏付けを取りたいのですが、なかなか見つかりません。 そこで、質問の角度を変えます。 この「関数の内々の事情説」、「関数の約束事説」という理解はいかがなものでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
先日の投稿も拝見したのですが、構造体とはStructureのことですよね? VB2008が手元にないためVB2005でテストしたのですが、 Publicでは無くとも動作はするようです。どのようなコードでどんなエラーになったのかご提示頂ければ、皆様も回答を付けやすいと思うのですが、 いかがでしょうか。VB2008で変更になったとは確認が取れないもので、 実際エラーになるのであれば申し訳有りません。 一応下記コードにて動作することは確認できました。 ---------------------------------------------------------- Public Class Form1 Private Structure TEST Dim TESTSTRING As String Dim TESTINTEGER As Integer End Structure Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim tst As TEST tst.TESTSTRING = "START" tst.TESTINTEGER = 0 Debug.Print(tst.TESTSTRING) Debug.Print(tst.TESTINTEGER.ToString) tst = TESTFUNCTION(tst) Debug.Print(tst.TESTSTRING) Debug.Print(tst.TESTINTEGER.ToString) End Sub Private Function TESTFUNCTION(ByVal source As TEST) As TEST Dim returnTEST As TEST = source returnTEST.TESTSTRING = "CHANGE" returnTEST.TESTINTEGER = 1 Return returnTEST End Function End Class ----------------------------------------------------------
その他の回答 (2)
- KG_
- ベストアンサー率62% (34/54)
redfox63様の回答の補足的なものになりますが、、 StructureをPrivateで宣言するとおそらく下記の関数がエラーになるかと思います。 > Sub ReferenceAllMember(ByRef T4 As TEST4) > T4.Member1 = "Member1 of T4" > T4.Member2 = "Member2 of T4" > End Sub これは、Privateで宣言された構造体TEST4がPublicな関数、ReferenceAllMemberで外部に公開されようとしているからです。(VBでアクセス修飾子を省略した場合、暗黙でPublicになります。) なので、「ReferenceAllMember」関数も「Private Sub」とすればエラーも解消できるはずですが、、、
お礼
必死の解釈も見当違いだということがわかりました。 >これは、Privateで宣言された構造体TEST4がPublicな関数、ReferenceAllMemberで外部に公開されようとしているからです。 本当に質問してよかったです。 ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
その関数がモジュールの外部からアクセスされないのであれば 構造体の宣言は Privateにできますよ Module Module1 private Structure stType1 public ss as String End Structure private Sub SubFunc1( st1 as stType1 ) Debug.Print( st1.ss ) End Sub ' 以下のように Module1以外へ公開するメソッドなどの引数として ' 使いたいなら Privateでの宣言はできません ' Sub SubFunc2( st1 as stType1 ) ' Debug.Print( st1.ss ) ' End Sub public Sub Test() dim p1 as StType p1.ss = "hoge" SubFUnc1( p1 ) End Sub End Module といった具合で ...
お礼
今、思ったのですが Sub Main() が・・・。 つまり、テストしているステージの問題かなー・・・。 と、思い出しました。 まだ、よく判っていません。
お礼
' ================================ ' 関数に構造体全体への参照を渡す ' ================================ Module theTEST Public Structure TEST4 Dim MembersCount As Integer Dim Member1 As String Dim Member2 As String End Structure Sub Main() Dim T4 As TEST4 T4.MembersCount = 2 T4.Member1 = "T4:Member1" T4.Member2 = "T4:Member2" ReferenceAllMember(T4) Debug.Print(T4.MembersCount.ToString) Debug.Print(T4.Member1) Debug.Print(T4.Member2) End Sub Sub ReferenceAllMember(ByRef T4 As TEST4) T4.Member1 = "Member1 of T4" T4.Member2 = "Member2 of T4" End Sub End Module このようなテストです。