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

わんくま同盟

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

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

■91946 / 17階層)  C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2302回)-(2019/08/13(Tue) 01:00:13)
No91938 (魔界の仮面弁士) に追記
>  Dim x() As Byte = New Byte(5) {11, 22, 33, 44, 55, 66}
>  Dim y As New ArraySegment(Of Byte)(x)
>  Dim z As New ArraySegment(Of Byte)(x, 2, 3)
> において、「y.Array」や「z.Array」は、配列 x への参照を意味します。
> なので、x(3) = 100 と代入すれば、z(1) も同様に 44 から 100 へと変化します。

補足説明。

System.ArraySegment(Of T) は、.NET Framework 2.0 以上で使用可能な、比較的歴史の長い型ですが、
「 z(1) 」のようにインデクサで参照するためには、.NET Framework 4.5 以上が必要となります。

.NET Framework 4 以下の場合、LINQ 操作にさえ対応していないのでご注意ください。




No91942 (魔界の仮面弁士) に追記
>> できれば、最終回答をお教えいただけないでしょうか?
> 申し訳ありませんが、現状は言語文法的な側面からしか回答できません。


ということで、文法的に変換しただけで、コンパイルすらしていないコードですが、
一応、当方で翻訳してみたものを掲載してみます。

C/C++ はそもそも専門外ですし、FFT の理論も全く理解しておらず、おまけに
どんな値を渡せばよいのか、そしてどういう結果になるべきかというテスト要件すら不明なので、
およそ「最終回答」と呼ぶには程遠いコードではありますが、一応参考までに。



'void fft(int n, double theta, double ar[], double ai[], double tmpr[], double tmpi[])
'{
Private Sub fft(ByVal n%, ByVal theta#, ByVal ar As ArraySegment(Of Double), ByVal ai As ArraySegment(Of Double), ByVal tmpr As ArraySegment(Of Double), ByVal tmpi As ArraySegment(Of Double))

  'if (n <= 1) return;
  If n <= 1 Then Exit Sub

  '/* ---- factorization ---- */
  'for (radix = 2; radix * radix <= n; radix++) {
  '  if (n % radix == 0) break;
  '}
  Dim radix As Integer = 2
  Do While radix * radix <= n
    If n Mod radix = 0 Then Exit Do
    radix += 1
  Loop

  'if (n % radix != 0) radix = n;
  'n_radix = n / radix;
  If n Mod radix <> 0 Then radix = n
  Dim n_radix As Integer = n \ radix

  '/* ---- butterflies ---- */
  'for (j = 0; j < n_radix; j++) {
  '  for (m = 0; m < radix; m++) {
  For j As Integer = 0 To n_radix - 1
    For m As Integer = 0 To radix - 1

      'xr = ar[j];
      'xi = ai[j];
      '==> ここから修正案の新コード
      Dim xr As Double = ar(j)
      Dim xi As Double = ai(j)
      '=== ここから No91939 の旧コード
      'Dim xr As Double = ar.Array(j)
      'Dim xi As Double = ai.Array(j)
      '<==


      'for (r = n_radix; r < n; r += n_radix) {
      For r As Integer = n_radix To n - 1 Step n_radix

        'wr = cos(theta * m * r);
        'wi = sin(theta * m * r);
        Dim wr0 As Double = Math.Cos(theta * m * r)
        Dim wi0 As Double = Math.Sin(theta * m * r)

        'xr += wr * ar[r + j] - wi * ai[r + j];
        'xi += wr * ai[r + j] + wi * ar[r + j];
        '==> ここから修正案の新コード
        xr += wr0 * ar(r + j) - wi0 * ai(r + j)
        xi += wr0 * ai(r + j) + wi0 * ar(r + j)
        '=== ここから No91939 の旧コード
        xr += wr0 * ar.Array(r + j) - wi0 * ai.Array(r + j)
        xi += wr0 * ai.Array(r + j) + wi0 * ar.Array(r + j)
        '<==

      '}
      Next r

      'wr = cos(theta * m * j);
      'wi = sin(theta * m * j);
      Dim wr As Double = Math.Cos(theta * m * j)
      Dim wi As Double = Math.Sin(theta * m * j)

      'tmpr[m * n_radix + j] = xr * wr - xi * wi;
      'tmpi[m * n_radix + j] = xi * wr + xr * wi;
      tmpr.Array(tmpr.Offset + m * n_radix + j) = xr * wr - xi * wi
      tmpi.Array(tmpi.Offset + m * n_radix + j) = xi * wr + xr * wi

    '}
    Next m

  '}
  Next j


  'for (r = 0; r < n; r += n_radix) {
  '  fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
  '}
  For r As Integer = 0 To n - 1 Step n_radix
    '==> ここから修正案の新コード (要 No91917 の拡張メソッド)
    fft(n_radix, theta * radix, tmpr.AsSegment(r), tmpi.AsSegment(r), ar, ai)
    '=== ここから No91939 の旧コード
    fft(n_radix, theta * radix, New ArraySegment(Of Double)(tmpr.Array, tmpr.Offset + r, tmpr.Count - r), New ArraySegment(Of Double)(tmpi.Array, tmpi.Offset + r, tmpi.Count - r), ar, ai)
    '<==
  Next r

  'for (j = 0; j < n_radix; j++) {
  '  for (m = 0; m < radix; m++) {
  '    ar[radix * j + m] = tmpr[n_radix * m + j];
  '    ai[radix * j + m] = tmpi[n_radix * m + j];
  '  }
  '}
  For j As Integer = 0 To n_radix - 1
    For m As Integer = 0 To radix - 1
      '==> ここから修正案の新コード (要 No91917 の拡張メソッド)
      ar.SetValue( radix * j + m, tmpr(n_radix * m + j) )
      ai.SetValue( radix * j + m, tmpi(n_radix * m + j) )
      '=== ここから No91939 の旧コード
      ar.Array(ar.Offset + radix * j + m) = tmpr.Array(n_radix * m + j)
      ai.Array(ai.Offset + radix * j + m) = tmpi.Array(n_radix * m + j)
      '<==
    Next m
  Next j

'}
End Sub
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[16]: C++からVBへの変換 /魔界の仮面弁士 返信無し
 
上記関連ツリー

C++からVBへの変換 / えんえん (19/08/08(Thu) 22:51) #91899
Re[1]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/08(Thu) 23:48) #91900
  └ Re[2]: C++からVBへの変換 / えんえん (19/08/09(Fri) 10:36) #91905
    └ Re[3]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 12:18) #91906
      └ Re[4]: C++からVBへの変換 / えんえん (19/08/09(Fri) 12:28) #91907
        └ Re[5]: C++からVBへの変換 / Hongliang (19/08/09(Fri) 12:46) #91908
          └ Re[6]: C++からVBへの変換 / ぶなっぷ (19/08/09(Fri) 13:05) #91909
            └ Re[7]: C++からVBへの変換 / えんえん (19/08/09(Fri) 13:12) #91910
              ├ Re[8]: C++からVBへの変換 / Hongliang (19/08/09(Fri) 13:18) #91911
              │└ Re[9]: C++からVBへの変換 / えんえん (19/08/09(Fri) 13:23) #91912
              │  └ Re[10]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 17:42) #91917
              └ Re[8]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 13:54) #91913
                └ Re[9]: C++からVBへの変換 / えんえん (19/08/10(Sat) 07:13) #91924
                  └ Re[10]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 09:41) #91925
                    └ Re[11]: C++からVBへの変換 / えんえん (19/08/10(Sat) 10:16) #91927
                      └ Re[12]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 14:19) #91930
                        └ Re[13]: C++からVBへの変換 / 774RR (19/08/10(Sat) 15:02) #91932
                          ├ Re[14]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 16:23) #91933
                          │└ Re[15]: C++からVBへの変換 / えんえん (19/08/11(Sun) 21:42) #91934
                          │  └ Re[16]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 12:05) #91938
                          │    ├ Re[17]: C++からVBへの変換 / えんえん (19/08/12(Mon) 14:12) #91939
                          │    │├ Re[18]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 16:25) #91940
                          │    │├ Re[18]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 17:33) #91942
                          │    │└ Re[18]: C++からVBへの変換 / 774RR (19/08/12(Mon) 16:56) #91941
                          │    └ C++からVBへの変換 / 魔界の仮面弁士 (19/08/13(Tue) 01:00) #91946 ←Now
                          └ Re[14]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 22:51) #91944
                            └ Re[15]: C++からVBへの変換 / えんえん (19/08/13(Tue) 11:01) #91947

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信