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

わんくま同盟

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

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


■91913 / )  Re[8]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2292回)-(2019/08/09(Fri) 13:54:08)
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 で
アンマネージ管理する力技ぐらいしか手が無いかと思います。

今回のように再帰呼び出しなら、クロージャにまとめてしまっても良いかも。
返信 編集キー/


管理者用

- Child Tree -