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

わんくま同盟

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

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

■91940 / 18階層)  C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2298回)-(2019/08/12(Mon) 16:25:23)
No91939 (えんえん さん) に返信
No91939 (えんえん さん) に返信
> 以下のようにしてみましたが
> やはりうまくいきませんでした。

同じ移植ミスを、他の行でも繰り返していますよ。

Dim z As ArraySegment(Of T) における、
z(0) と z.Array(0) の違いをもう一度見直してみましょう。


>> において、「y.Array」や「z.Array」は、配列 x への参照を意味します。
>> なので、x(3) = 100 と代入すれば、z(1) も同様に 44 から 100 へと変化します。
> 「y.Array」や「z.Array」を書き換えた時
> 元の配列xも同時に変化してくれないといけないのではないのでしょうか?

はい。ご認識の通り、連動して変化します。
そして先のそれは「変化することを理解していただくための説明コード」として記載したものです。


No91938 の説明コードにおいて、読み取り専用の z(1) が x(3) と同じ物であり、
それが z.Array(z.Offset + 1) を通じて書き換えられることを理解できていれば、
>>> Dim xr As Double = ar.Array(j)

>>> xr += (wr0 * ar.Array(r + j) - wi0 * ai.Array(r + j))

>>> tmpi.Array(m * n_radix + j) = xi * wr + xr * wi

>>> ai.Array(radix * j + m) = tmpi.Array(n_radix * m + j)
といったミスをおこさずに済んだかと思います。


あるいはこの移植ミスが理解不足によるものでもなく、
単なるうっかりミスだったのであれば、「ステップ実行」して
配列の内容を確認しながら動作チェックしていれば、
その間違いに気づけたかもしれません。


いずれにせよ、毎回、Offset を考慮したコードを書くのは移植ミスを引き起こしやすいので、
元の C/C++ コードに近い記述にできるよう、何らかのヘルパーメソッドを
設けることをおすすめしておきます。 No91917 のような拡張メソッドのように。


> 元の配列xは変化しない方が良いという意味ですか?

変化させる必要があるからこそ、ArraySegment の利用を提案した次第です。
変化しないと再帰処理させられないという点は、 No91913 の冒頭でも述べていますね。


ArraySegment を使わない場合は、御自身で書かれた r_st% のように、
Offset に相当する引数をそれぞれの配列に対して用意する案が使えます。

配列が 4 つあるので、本来であれば管理すべき添字も 4 つ分必要ですが、
今回のケースでは tmp 版か否かで 2 系統あれば十分かと思います。
(複素数の虚数部と実数部は同じ添字管理で済むため)


> fftを再帰的に呼び出しているわけですが、
> この場合、配列を書き換えて元のサブルーチンに返しているわけなので、
> 参照型である必要があるのではないでしょうか?

「『参照型』と『値型』の違い」の話と、
「『参照渡し(ByRef)』と『値渡し(ByVal)』違い」の話が
まだごっちゃになっているように見えます。


> もっとも配列の場合、ByValを指定したところで、ByRef扱いになると思いますが
> 間違っていますか?

間違っています。


今回の『void fft(int n, double theta, double ar[], double ai[], double tmpr[], double tmpi[])』において、
配列部は double* 型のポインタと認識されますが、
 theta = 新しいdouble値;
 ar = 新しいdouble配列を指すポインタ;
 ai = 新しいdouble配列を指すポインタ;
 tmpr = 新しいdouble配列を指すポインタ;
 tmpi = 新しいdouble配列を指すポインタ;
という処理は一切出てきません。

あるのは、
 tmpr[何某] = 新しいdouble値;
 tmpi[何某] = 新しいdouble値;
 ar[何某] = 新しいdouble値;
 ai[何某] = 新しいdouble値;
だけですよね。つまり、これらの引数は「出力引数」ではありません。


同様に、今回記載された No91939 においても、
仮引数に対して、新しい配列や ArraySegment を割り当てている個所はどこにもないですよね。
実引数に対して、新しい配列や ArraySegment を割り当てている個所ならばありますけれども。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[17]: 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
                          │    │├ C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 16:25) #91940 ←Now
                          │    │├ Re[18]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 17:33) #91942
                          │    │└ Re[18]: C++からVBへの変換 / 774RR (19/08/12(Mon) 16:56) #91941
                          │    └ Re[17]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/13(Tue) 01:00) #91946
                          └ Re[14]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 22:51) #91944
                            └ Re[15]: C++からVBへの変換 / えんえん (19/08/13(Tue) 11:01) #91947

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