• ベストアンサー

VB2008: 構造体と関数との関係?

VB.Net を知って60日余という初学者です。 やっと、構造体の基本事項の確認まで辿り着きました。 で、構造体と関数の関係をテスト。 結果、「関数に構造体全体を渡す場合には、たとえモジュールレベルの変数として宣言してモジュールレベルだけで用いるとしても Public で広域な変数として宣言しなければならない」ことが判明しました。 このことに関しての個人的な見解は次のようです。 >「関数のパラメータの型に用いる構造体等は全て Public で宣言されることで公開されていなければならない。 >関数がどういう型を受け取って、どのように演算し、いかなる型の値として戻すかは公開されていてこそ判断できる。 つまり、「関数の内々の事情、関数の約束事からの Public 宣言であって、構造体の通用範囲を広域にするためのそれではない」というのが私の理解。 問題は、MSDN ライブラリでこの理解の裏付けを取りたいのですが、なかなか見つかりません。 そこで、質問の角度を変えます。 この「関数の内々の事情説」、「関数の約束事説」という理解はいかがなものでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • KG_
  • ベストアンサー率62% (34/54)
回答No.2

先日の投稿も拝見したのですが、構造体とは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 ----------------------------------------------------------

noname#140971
質問者

お礼

' ================================ ' 関数に構造体全体への参照を渡す ' ================================ 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 このようなテストです。

その他の回答 (2)

  • KG_
  • ベストアンサー率62% (34/54)
回答No.3

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」とすればエラーも解消できるはずですが、、、

noname#140971
質問者

お礼

必死の解釈も見当違いだということがわかりました。 >これは、Privateで宣言された構造体TEST4がPublicな関数、ReferenceAllMemberで外部に公開されようとしているからです。 本当に質問してよかったです。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

その関数がモジュールの外部からアクセスされないのであれば 構造体の宣言は 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 といった具合で ...

noname#140971
質問者

お礼

今、思ったのですが Sub Main() が・・・。 つまり、テストしているステージの問題かなー・・・。 と、思い出しました。 まだ、よく判っていません。

専門家に質問してみよう