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

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

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

全過去ログを検索

<< 0 | 1 >>
■51748  Re[6]: ファイルダウンロード時に処理中ダイアログを表示したい。
□投稿者/ Hiro -(2010/07/15(Thu) 19:31:56)
    No51733 (もりお さん) に返信
    > 回避策としては
    > ・btnStartDL クリック後、非同期ポストバックの完了イベントのハンドラーで
    > btnMakeFile.click() を呼び出すようにしたり
    > ・サーバー側でExcelファイル作成のみ行って、非同期ポストバックの完了イベント
    > のハンドラーで alert('DL処理を行う。') の処理を行うようにしたり
    > してみてはいかがでしょうか。

    返信が遅くなり申し訳ありません。

    もりおさんがおっしゃった通りに非同期ポストバックの完了イベントのハンドラーで処理を行ってみたいと思います。

    ありがとうございました。
記事No.51699 のレス / END /過去ログ87より / 関連記事表示
削除チェック/

■55710  Re[5]: データ取得済みDataTableからの絞り込み
□投稿者/ asuka -(2010/12/09(Thu) 21:58:02)
    shuさま

    何度も申しわけありません。m(__)m

    > または
    > row = tbl.NewRow
    > tbl.Rows.Add(row)
    > rowの編集
    > をして
    > Da.Update(tbl)
    > のような感じになります。

    「rowの編集」というのは、存在する行にちなんだ列数分データを手動で設定しなければならないのでしょうか?
    Ex.
    row[i][0]=1
    row[i][1]="data1"
    row[i][2]="data2"
    row[i][3]="YYYYMMDD"

    今回はMDBへSQLサーバで取得したデータをそのまま入るのが主旨でしたので、
    DataRow[] dataRows = dtSQLA.Select("BuNo = " + i);
    DataRow dataRowsTemp;
    //int nCntRows = 0;
    foreach (DataRow dr in dataRows)
    {
     dataRowsTemp = dtMDBA.NewRow();
     //行追加
     dtMDBA.Rows.Add(dataRowsTemp);
     //rowの編集をしなくてはだめ?
     //更新
     oleDBDAMDBA.Update(dtMDBA);
     //nCntRows++;
    }

    のように、可能であれば「行の追加」の前にカウンタを設けて(カウンタの更新はコメントアウトの位置)
    dataRowsTemp = dataRows[nCntRows];
    としてAdd後、Updateとしてそのままコピーしたかったのですが、これはダメでした。
    →この行は既に別のテーブルに属しています。

    DataTableにImportRowというのを見つけましたので、これで何とかならなかもう少し粘ってみたいと思います。

    いつもありがとうございます。
記事No.55685 のレス /過去ログ93より / 関連記事表示
削除チェック/

■74712  選択されている親ノードの子ノード全てを取得するには?
□投稿者/ C#初心者 -(2015/01/25(Sun) 22:18:19)

    分類:[C#] 

    ツリービューにて、
    下記のようなコードがあったとします。
    このときに、ツリービュー上でノードを選択した場合に、
    選択したノードの子ノード全てを取得するには
    treeView1_AfterSelectイベントでどのように処理したらよいのでしょうか?

    どなたか分かるかた教えてください。
    よろしくお願いします。

    =====================================
    尚、次のようなツリー表示になっていす。
    食べ物
    ー野菜
    ーーキャベツ
    ー果物
    ーーバナナ
    ー魚
    ーー鮭
    ーーぶり

    魚を選択した場合には、鮭、ぶり

    果物を選択した場合には、バナナ

    食べ物を選択した場合には、
    野菜、キャベツ、果物、バナナ、魚、鮭、ぶり

    といった様に取得したいです。
    =====================================

    コード
    =====================================
    treeView1.Nodes.Clear();

    TreeNode rootNode = new TreeNode();
    TreeNode childNode1 = new TreeNode();
    TreeNode childNode2 = new TreeNode();
    TreeNode childNode3 = new TreeNode();

    TreeNode grandChildNode1 = new TreeNode();
    TreeNode grandChildNode2 = new TreeNode();
    TreeNode grandChildNode3 = new TreeNode();
    TreeNode grandChildNode4 = new TreeNode();


    //親ノードの作成
    rootNode.Text = "食べ物";

    //子ノードの作成
    childNode1.Text = "野菜";
    childNode2.Text = "果物";
    childNode3.Text = "魚";

    //孫ノードの作成
    grandChildNode1.Text = "キャベツ";
    grandChildNode2.Text = "バナナ";
    grandChildNode3.Text = "鮭";
    grandChildNode4.Text = "ブリ";

    //親ノードをTreeViewに追加
    treeView1.Nodes.Add(rootNode);

    //子ノードを親ノードに追加
    rootNode.Nodes.Add(childNode1);
    rootNode.Nodes.Add(childNode2);
    rootNode.Nodes.Add(childNode3);
    //子ノードを孫ノードに追加
    childNode1.Nodes.Add(grandChildNode1);
    childNode2.Nodes.Add(grandChildNode2);
    childNode3.Nodes.Add(grandChildNode3);
    childNode3.Nodes.Add(grandChildNode4);
    =====================================
親記事 /過去ログ125より / 関連記事表示
削除チェック/

■87588  アプリケーションのエントリ ポイントで、ファイル名を知る
□投稿者/ カッパヤロー -(2018/06/11(Mon) 13:38:19)

    分類:[C#] 

    c#の最初に実行される個所は、Program.csに記載されている
    Mainメソッドになると思うのですが、

    このメソッドに入った時に、実行し用としている(自分自身の)
    アプリケーション名や、実行ファイル名を取得する方法はあるでしょうか?

    Formが立ち上がってしまえば、control.ProductName で知れるのですが…

    以上よろしくお願いします
親記事 /過去ログ150より / 関連記事表示
削除チェック/

■88478  WPFでグラフの表示を行いたい
□投稿者/ k_kt -(2018/09/03(Mon) 05:09:50)

    分類:[.NET 全般] 

    VB.NETを使ってWPFでの開発を試みております。
    (.NetFramework:4.0)

    9/1 0時〜 9/2 0時までのように期間を指定して、
    状態A、B、C、A、Bのような形で、その時の状態を表示させたいのですが
    適切なコントロールはありますでしょうか?

    積上げ棒グラフがイメージとしては近いのですが
    集計されていない状態で表示させたいです。
親記事 /過去ログ152より / 関連記事表示
削除チェック/

■91085  Re[1]: C# 正規表現で置換
□投稿者/ 魔界の仮面弁士 -(2019/05/27(Mon) 10:03:16)
    No91078 (kawauso さん) に返信
    > 後ろ文字列4文字が置換対象です。
    > 以下でやってみたのですが、ダメでした。。。
    > string wkTarget = "HOGEHOGEFS01F1ST";
    > wkTarget = System.Text.RegularExpressions.Regex.Replace(wkTarget, @"F[\d]ST", @"N$\dST");

    wkTarget = System.Text.RegularExpressions.Regex.Replace(wkTarget, @"F(\d)ST$", @"N$1ST");

    でどうでしょう。
記事No.91078 のレス /過去ログ157より / 関連記事表示
削除チェック/

■91899  C++からVBへの変換
□投稿者/ えんえん -(2019/08/08(Thu) 22:51:15)

    分類:[.NET 全般] 

    以下の再帰的なコードをVBに書き換えたいのですが
    どのようにすれば良いでしょうか?


    http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/ftmn1_23.html#sec1_2_3


    void fft(int n, double theta, double ar[], double ai[],
    double tmpr[], double tmpi[])
    {
    int radix, n_radix, j, m, r;
    double xr, xi, wr, wi;

    for (r = 0; r < n; r += n_radix) {
    fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
    }
    }


    tmprとtmpiは一次元配列なのですが、
    なぜか、要素数rを指定した上で、
    サブルーチンに渡しています。
    要素数を指定すると配列ではなく、doubleの値になってしまいますが、
    なぜこのようなことができるのでしょうか?

    変数の前の&で何か別のものに置き換えているのでしょうか?

    https://ja.cppreference.com/w/cpp/language/operator_precedence

    このページを見ると
    アドレス取得、と書かれていますが、どういうことですか?

親記事 /過去ログ158より / 関連記事表示
削除チェック/

■91900  Re[1]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/08(Thu) 23:48:22)
    2019/08/08(Thu) 23:52:48 編集(投稿者)

    No91899 (えんえん さん) に返信
    > int radix, n_radix, j, m, r;
    > double xr, xi, wr, wi;

    省略転記したために、使われていない変数や未初期化変数がチラホラ…。


    > 以下の再帰的なコードをVBに書き換えたいのですが
    > どのようにすれば良いでしょうか?

    「ar As Double()」のかわりに、
    「ar As ArraySegment(Of Double)」を使ってみては如何でしょう。

    System.Span(Of T) 構造体を使える環境の場合は Span で。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91905  Re[2]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/09(Fri) 10:36:54)
    
    
    ありがとうございます。
    
    
    
            For r As Integer = 0 To N - 1
    
                Dim ar2 As New ArraySegment(Of Double)(ar, r, r)
                Call FFT(・・・・,ar2,・・・・)
    
            Next
    
    こうするという意味ですか?
    
    
            For i = 0 To 300
    
                Dim hhh = ar(i)
    
            Next
    
    のようにして、配列と同じように値を取得できませんが
    どのように使用すれば良いのでしょうか?
    
    
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91906  Re[3]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/09(Fri) 12:18:23)
    No91905 (えんえん さん) に返信
    > 配列と同じように値を取得できませんが
    > どのように使用すれば良いのでしょうか?

    ArraySegment は「大きな配列に対する一部の範囲のみ」を切り出した情報を管理します。
    イメージとしてはこんな感じ。

    Public Class ArraySegment
     Public Property Array As Double() '←管理対象となる配列そのものを表す

     Public Property Offset As Integer  'その配列のどの位置から
     Public Property Count As Integer   '幾つ分の要素を扱いたいのかを管理
    End Class


    使い方の例として:

    Module Module1

      Sub Main()
        Dim dblArray As Double() = {11, 22, 33, 44, 55, 66, 77, 88}

        Dim ar1 As New ArraySegment(Of Double)(dblArray)

        Console.WriteLine("=== 中身を確認 ===")
        Test1_Dump(ar1)

        Console.WriteLine("=== 2〜5番目を切り出す ===")
        Dim ar2 = Test2_Slice(ar1)
        Test1_Dump(ar2)

        Console.WriteLine("=== 0 番目と 2 番目の値を入れ替える ===")
        Test3_Swap(ar2)
        Test1_Dump(ar2)

        Console.WriteLine("=== 1 番目の値を 10 倍にする ===")
        Test4_Modify(ar2)
        Test1_Dump(ar2)

        Console.WriteLine("=== 元の配列はどうなったか? ===")
        Array.ForEach(dblArray, AddressOf Console.WriteLine)

        Console.Write("*** 何かキーを押してください ***")
        Console.ReadKey()
      End Sub

      '中身を列挙してみる
      Sub Test1_Dump(a As ArraySegment(Of Double))
        Console.WriteLine("全要素数={0}", a.Array.Length)
        Console.WriteLine("開始位置={0}", a.Offset)
        Console.WriteLine("範囲の数={0}", a.Count)
        For Each dbl In a
          Console.WriteLine("... {0}", dbl)
        Next
        Console.WriteLine("----")
      End Sub

      '相対位置指定で index +2〜+5 の位置を切り出して返す
      Function Test2_Slice(a As ArraySegment(Of Double)) As ArraySegment(Of Double)
        Return New ArraySegment(Of Double)(a.Array, a.Offset + 2, 4)
      End Function

      '相対位置指定で index 0 と index 2 の値を入れ替える
      Sub Test3_Swap(a As ArraySegment(Of Double))
        Dim swap0 As Double = a(0)
        Dim swap2 As Double = a(2)
        a.Array(a.Offset + 0) = swap2
        a.Array(a.Offset + 2) = swap0
      End Sub

      '相対位置指定で index 1 の場所の値を 10 倍にする
      Sub Test4_Modify(a As ArraySegment(Of Double))
        a.Array(a.Offset + 1) *= 10
      End Sub
    End Module
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91907  Re[4]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/09(Fri) 12:28:51)
    ありがとうございます。

    C++でいう
    &tmpr[r]
    これって要素rだけを取り出しているのでしょうか?
    あるいはr以降を取り出しているのでしょうか?
    これをVBで書くとどうなりますか?
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91908  Re[5]: C++からVBへの変換
□投稿者/ Hongliang -(2019/08/09(Fri) 12:46:03)
    > C++でいう
    > &tmpr[r]
    > これって要素rだけを取り出しているのでしょうか?
    > あるいはr以降を取り出しているのでしょうか?

    強いて言えば後者ですが、正しく言うとどちらでもありません。
    ポインタをちゃんと説明するのは掲示板形式では割と無理目なので、C言語を勉強してください。

    > これをVBで書くとどうなりますか?

    VBでは言語レベルで表現することはできません。
    // ライブラリなら、既に挙げられているArraySegmentやSpanが近いです。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91909  Re[6]: C++からVBへの変換
□投稿者/ ぶなっぷ -(2019/08/09(Fri) 13:05:25)
    微妙です。
    要素r(言い方が微妙だが、まぁ気にしないでおく)の先頭ポインタです。
    
    double* itemr = &tmpr[r];
    としたとき。
    
    *itemr は、まさに要素rの値(double型)
    
    ただ、itemrはポインタであり、ポインタは配列アクセスができます。
    なので、
      for(int i=0; i<...; i++)   // ループ終了条件は省略
      {
         itemr[i];
      }
    とすれば、要素r以降の要素に順次アクセスすることもできます。
    
    なお、ポインタはVBにはない概念です。
    単純置換はできません。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91910  Re[7]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/09(Fri) 13:12:21)
    ありがとうございます。

    つまり、要素数r以降の配列を
    別の配列にコピーすれば同じことができるわけでしょうか?

    あと、IntPtrはポインタではないのでしょうか?

記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91911  Re[8]: C++からVBへの変換
□投稿者/ Hongliang -(2019/08/09(Fri) 13:18:45)
    2019/08/09(Fri) 13:19:21 編集(投稿者)

    > つまり、要素数r以降の配列を
    > 別の配列にコピーすれば同じことができるわけでしょうか?

    「同じこと」はできませんが、近い処理はできるでしょう。
    パフォーマンス的に凄い不利ですが。

    > あと、IntPtrはポインタではないのでしょうか?

    ポインタを格納できるサイズを持った整数型、です。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91912  Re[9]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/09(Fri) 13:23:41)
    ありがとうございます。

    For r As Integer = 0 To N - 1

    Dim ar2 As New ArraySegment(Of Double)(ar, r, r)
    Call FFT(・・・・,ar2,・・・・)

    Next

    は間違いで

    For r As Integer = 0 To N - 1

    Dim ar2 As New ArraySegment(Of Double)(ar, r, ar.length - r)
    Call FFT(・・・・,ar2,・・・・)

    Next

    が正しいのでしょうか?
    要素数を最後まで指定しないといけないですよね?
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91917  Re[10]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(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
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■91924  Re[9]: C++からVBへの変換
□投稿者/ えんえん -(2019/08/10(Sat) 07:13:12)
    ありがとうございます。
    
    
    void fft(int n, double theta, double ar[], double ai[], 
            double tmpr[], double tmpi[])
    {
        int radix, n_radix, j, m, r;
        double xr, xi, wr, wi;
    
        if (n <= 1) return;
        /* ---- factorization ---- */
        for (radix = 2; radix * radix <= n; radix++) {
            if (n % radix == 0) break;
        }
        if (n % radix != 0) radix = n;
        n_radix = n / radix;
        /* ---- butterflies ---- */
        for (j = 0; j < n_radix; j++) {
            for (m = 0; m < radix; m++) {
                xr = ar[j];
                xi = ai[j];
                for (r = n_radix; r < n; r += n_radix) {
                    wr = cos(theta * m * r);
                    wi = sin(theta * m * r);
                    xr += wr * ar[r + j] - wi * ai[r + j];
                    xi += wr * ai[r + j] + wi * ar[r + j];
                }
                wr = cos(theta * m * j);
                wi = sin(theta * m * j);
                tmpr[m * n_radix + j] = xr * wr - xi * wi;
                tmpi[m * n_radix + j] = xi * wr + xr * wi;
            }
        }
        for (r = 0; r < n; r += n_radix) {
            fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
        }
        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];
            }
        }
    }
    
    
    これを以下のように翻訳してみました。
    
    
        Public Sub one_D_FFT(ByRef xr#(), ByRef xi#())
    
    
            Dim n As Integer = xr.GetLength(0) - 1
    
            Dim theta = 2 * Math.PI / n
    
            Dim tmpr(n) As Double, tmpi(n) As Double
    
            Call fft(n, theta, xr, xi, tmpr, tmpi, 0)
    
    
        End Sub
    
        Private Sub fft(ByVal n%, ByVal theta#, ByRef ar#(), ByRef ai#(), ByRef tmpr#(), ByRef tmpi#(), ByVal r_st%)
    
            If n <= 1 Then Exit Sub
    
            Dim radix As Integer = 2
            Do While radix * radix <= n
                If n Mod radix = 0 Then Exit Do
                radix += 1
            Loop
    
            If n Mod radix <> 0 Then radix = n
    
            Dim n_radix As Integer = n \ radix
    
            For j As Integer = 0 To n_radix - 1
    
                For m As Integer = 0 To radix - 1
    
                    Dim xr As Double = ar(r_st + j)
                    Dim xi As Double = ai(r_st + j)
    
                    For r As Integer = n_radix To n - 1 Step n_radix
    
                        Dim wr0 As Double = Math.Cos(theta * m * r)
                        Dim wi0 As Double = Math.Sin(theta * m * r)
                        xr += (wr0 * ar(r_st + r + j) - wi0 * ai(r_st + r + j))
                        xi += (wr0 * ai(r_st + r + j) + wi0 * ar(r_st + r + j))
    
                    Next r
    
    
                    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
    
                Next m
    
            Next j
    
            For r As Integer = 0 To n - 1 Step n_radix
    
                fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r)
    
            Next r
    
    
    
            For j As Integer = 0 To n_radix - 1
    
                For m As Integer = 0 To radix - 1
    
                    ar(r_st + radix * j + m) = tmpr(n_radix * m + j)
                    ai(r_st + radix * j + m) = tmpi(n_radix * m + j)
    
                Next m
    
            Next j
    
    
        End Sub
    
    
    
    しかし、むちゃくちゃな結果しか得られないのですが・・・・。
    どこが間違っていますでしょうか?
    
    
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91925  Re[10]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/10(Sat) 09:41:30)
    No91924 (えんえん さん) に返信
    > Public Sub one_D_FFT(ByRef xr#(), ByRef xi#())
    > Private Sub fft(ByVal n%, ByVal theta#, ByRef ar#(), ByRef ai#(), ByRef tmpr#(), ByRef tmpi#(), ByVal r_st%)

    r_st% で、添字のオフセットを表す方向で実装しようしているのですね。

    ところで何故、配列を ByRef で渡しているのでしょうか?
    VBA じゃあるまいし…。

    OutAttribute 属性的な意味合いがある場合には ByRef にすることもありますが、
    配列は「参照型」なのですから、通常は ByRef にする必要などないはずです。

    Return をあえて Exit Sub の構文で記述している点を鑑みると、
    .NET ではない時代の Visual Basic に慣れている方なのでしょうか。



    > どこが間違っていますでしょうか?

    最大の問題はここです。r_st が考慮されていませんよね。
    この処理が再帰であることを忘れていませんか?

    > 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
    >   fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r)
    > Next r
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 >>

パスワード/

- Child Tree -