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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91913 の関連記事表示

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

    今回のように再帰呼び出しなら、クロージャにまとめてしまっても良いかも。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -