| 2019/08/09(Fri) 17:05:54 編集(投稿者)
■No91910 (えんえん さん) に返信 > つまり、要素数r以降の配列を > 別の配列にコピーすれば同じことができるわけでしょうか?
配列をコピーする必要はありません。同じ配列を参照しておき、 その配列のどの位置を読み書きするのかという、Index 情報さえあれば OK です。
というか、今回の fft は配列引数の内容を書き換えるものなので、 配列の「コピー」を渡してしまっては、再帰処理の意味が無いと思います。
■No91907 (えんえん さん) に返信 > C++でいう > &tmpr[r] > これって要素rだけを取り出しているのでしょうか?
実引数 &x[2] が 仮引数 y[] に渡されたとき、 y[1] は、呼び出し元の x[3] を意味します。
下記のようにすると、 22, 33, 55 11, 22, 44 と出力されます。
// ------------------ void fff(double ar[]) { std::cout << ar[-1] << ", " << ar[0] << ", " << ar[2] << std::endl; }
int main() { double ary[5]; ary[0] = 11; ary[1] = 22; ary[2] = 33; ary[3] = 44; ary[4] = 55;
fff(&ary[2]); fff(&ary[1]);
return 0; }
> あるいはr以降を取り出しているのでしょうか?
とりあえず、VB でこんな処理があったとします。 この場合、仮引数「d」は、実引数「dblArray(1)」への参照となっています。
Sub Main() Dim dblArray As Double() = {11, 22, 33} Test(dblArray(1)) Array.ForEach(dblArray, AddressOf Console.WriteLine) End Sub Sub Test(ByRef d As Double) d = 123 End Sub
上記を実行すると、配列の内容が {11, 22, 33} から { 11, 123, 33 } に変化します。
Test 側で dblArray(1) だけでなく dblArray(2) も書き換えられるようにする場合には、 配列全体を渡すようにして、書き換える位置を別の引数で渡すようにします。
Sub Main() Dim dblArray As Double() = {11, 22, 33} Test(dblArray, 1) Array.ForEach(dblArray, AddressOf Console.WriteLine) End Sub Sub Test(ByVal d As Double(), ByVal i As Integer) d(i + 0) = 123 d(i + 1) = 456 End Sub
> これをVBで書くとどうなりますか?
たとえば上記の処理は、最近の C# だとこのように書けます。
/* 要 C# 7.2 以上 / VS2017 15.5 以上 */ static void Main() { double[] dblArray = { 11, 22, 33 }; Test(dblArray.AsSpan(1)); // { 22, 33 } が渡される Array.ForEach(dblArray, Console.WriteLine); // { 11, 123, 456 } が渡される }
private static void Test(Span<double> span) { span[0] = 123; span[1] = 456; }
将来的には Visual Basic でも同じように書ける様になると思いますが、 現状の言語仕様だと、自前で位置管理の変数を追加するなり、 ArraySegment を経由させるなり、あるいは IntPtr で アンマネージ管理する力技ぐらいしか手が無いかと思います。
今回のように再帰呼び出しなら、クロージャにまとめてしまっても良いかも。 |