| ■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 |