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

わんくま同盟

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

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


■91917 / )  Re[10]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2293回)-(2019/08/09(Fri) 17:42:02)
2019/08/13(Tue) 00:01:21 編集(投稿者)

追記:拡張メソッドの不具合修正

No91912 (えんえん さん) に返信
> Dim ar2 As New ArraySegment(Of Double)(ar, r, ar.length - r)
> が正しいのでしょうか?
> 要素数を最後まで指定しないといけないですよね?

そうなりますね。


処理を分かりやすくするために、ArraySegment のための
拡張メソッドを用意しておくのが良いでしょう。


後述のコードを用意しておけば、
  // 元の C++ 実装
  tmpr[m * n_radix + j] = xr * wr - xi * wi;
に相当する処理を、
  tmpr.SetValue(m * n_radix + j, xr * wr - xi * wi)
の構文で書ける様になります。


また、再帰呼び出しの
  // C++
  fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
についても、
  fft(n_radix, theta * radix, tmpi.AsSegment(r), tmpi.AsSegment(r), ar, ai)
で済むようになります。



'----------------------
Module ArraySegmentExtension
  <System.Runtime.CompilerServices.Extension>
  Public Function AsSegment(Of T)(this As T()) As ArraySegment(Of T)
    Return New ArraySegment(Of T)(this)
  End Function

  <System.Runtime.CompilerServices.Extension>
  Public Function AsSegment(Of T)(this As T(), start As Integer) As ArraySegment(Of T)
    Return New ArraySegment(Of T)(this, start, this.Length - start)
  End Function

  <System.Runtime.CompilerServices.Extension>
  Public Function AsSegment(Of T)(this As ArraySegment(Of T), start As Integer) As ArraySegment(Of T)
    'Return New ArraySegment(Of T)(this.Array, this.Offset + start, this.ToArray.Length - this.Offset - start)
    Return New ArraySegment(Of T)(this.Array, this.Offset + start, this.Array.Length - this.Offset - start)
  End Function

  <System.Runtime.CompilerServices.Extension>
  Public Function AsSegment(Of T)(this As ArraySegment(Of T), start As Integer, length As Integer) As ArraySegment(Of T)
    Return New ArraySegment(Of T)(this.Array, this.Offset + start, length)
  End Function

  <System.Runtime.CompilerServices.Extension>
  Public Function AsSegment(Of T)(this As T(), start As Integer, length As Integer) As ArraySegment(Of T)
    Return New ArraySegment(Of T)(this, start, length)
  End Function

  <System.Runtime.CompilerServices.Extension>
  Public Function SetValue(Of T)(this As ArraySegment(Of T), index As Integer, newValue As T) As ArraySegment(Of T)
    this.Array(this.Offset + index) = newValue
    Return this
  'End Sub
  End Function
End Module
返信 編集キー/


管理者用

- Child Tree -