C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■91942 / )  Re[18]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2299回)-(2019/08/12(Mon) 17:33:28)
No91939 (えんえん さん) に返信
> できれば、最終回答をお教えいただけないでしょうか?
> 恐らく、こうやって何度もやりとりするよりも
> 効率的だと思うのですが・・・

申し訳ありませんが、現状は言語文法的な側面からしか回答できません。

自分は高速フーリエ変換について正確に理解しているわけではないため、
「作成依頼」に近い「質問」をされても、デバッグすることができないためです。


実引数としてどういう値を入れた時に、なんという結果が返されるのか示す、
ブラックボックステストのための情報があるわけでも無いですし。



> もし、出力引数がなければ、
> 再帰処理の意味がなくなってしまうと思うのですが・・・

今回は ByVal で十分でしょう。

改めて、 No91906 の最後の個所にあるコードで説明してみます。
今回は意図的に ByVal を付けておきます。

  Sub Test4_Modify(ByVal a As ArraySegment(Of Double))
    a.Array(a.Offset + 1) *= 10
  End Sub

このコードは「ByVal a As ArraySegment(Of T)」という宣言になっていますが、
呼び出し元の値は、きちんと 10 倍になっています。


・ArraySegment(Of T) 構造体は値型。

・T が値型であれ参照型であれ、配列 T() は列は常に「参照型」。

・a.Array プロパティが返す型は As T() なので「参照型」。

・a.Array プロパティは ReadOnly であり、書き換えられない。
 たとえば「a.Array = Nothing」などと書くことはできない。

・a.Array プロパティから返される「一次元配列」は、
 ReadOnly というわけではないので、その要素を書き換えることができる。
 たとえば「a.Array(0) = Nothing」や「a(1) *= 10」と書いても良い。



==== 入力引数の例 <In> === ※いずれも ByVal で書いている。

 Sub Method1(ByVal x() As Integer)
   x(0) = 100 ' 呼び出し元の実引数では、配列の先頭要素が 100 に替わる。ただし、配列そのものが指しかわるわけでは無い。
 End Sub

 Sub Method2(ByVal lbl As Label)
   lbl.Text = CStr(Now) ' 呼び出し元で指定した Label のテキストが変化する。ただし、Label 型変数が別のラベルを指し示すわけでは無い。
 End Sub

 Sub Method3(ByVal pt As Point)
   Console.WriteLine("{0}, {1}", pt.X, pt.Y)
 End Sub


==== 出力引数の例 <Out> === ※いずれも ByRef で書いている。

 Sub Method4(ByRef x() As Integer)
   x = New Integer() { 0, 1, 2, 3 } ' 呼び出し元が渡した変数の内容は、新しい配列の参照へと差し替わる。
 End Sub

 Sub Method5(ByRef f As Form)
   f = New Form2() ' 呼び出し元が渡した変数の内容は、Form2 への参照へと書き換わる。
 End Sub

 Sub Method6(ByRef i As Integer)
   i = 12345 ' 呼び出し元が渡した変数の内容は、12345 という値に書き換わる。
 End Sub

 Sub Method7(ByRef pt As Point)
   pt = New Point(-1, 1) ' 呼び出し元が渡した変数の内容は、座標 (-1, 1) という値に置き換わる。
 End Sub


==== 入出力引数の例 <In, Out> === ※いずれも ByRef でなければならない。

 Sub Method8(ByRef x As Integer)
   x += 1
 End Sub

 Sub Method9(ByRef pt As Point)
   pt.Offset(-1, 1)
 End Sub

 Function Method10(ByVal x As Point) As Point
   pt.Offset(-1, 1)
   Return pt
 End Sub
返信 編集キー/


管理者用

- Child Tree -