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

わんくま同盟

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

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

■91930 / 12階層)  C++からVBへの変換
□投稿者/ 魔界の仮面弁士 (2295回)-(2019/08/10(Sat) 14:19:15)
No91927 (えんえん さん) に返信
> それでも、やはり正しい結果は得られないのですが、なぜでしょうか?

「ar と ai」「tmpr と tmpi」は、再帰処理のたびに入れ替わりますよね。
ざっと見た感じでは、入れ替えた際の添字管理に問題があるように見えます。


話を単純化するため、元の処理を下記のように置き換えてみましょう。

 void Proc(int x[], int y[])
 {
  if (x[0] != 0) Proc(&y[1], x);
 }
 void main()
 {
  int ar1[4] = { 11, 22, 33, 0 };
  int ar2[4] = { 55, 66, 77, 0 };
  Proc(ar1, ar2);
 }

この場合、ポインタは以下のように遷移しますよね。
この動作をポインタ代わりの r_st% で管理しようとして、失敗しているように見えます。

 main から渡す実引数は
  ar1 が { 11, 22, 33, 0 }
  ar2 が { 55, 66, 77, 0 }
 → C++ の main から呼び出された Proc の仮引数
  x は { 11, 22, 33, 0 }
  y は { 55, 66, 77, 0 }
 →→→ 1 回目の再帰処理で呼ばれた Proc の仮引数
  x は { 66, 77, 0 }
  y は { 11, 22, 33, 0 }
 →→→→ 2 回目の再帰処理で呼ばれた Proc の仮引数
  x は { 22, 33, 0 }
  y は { 66, 77, 0 }
 →→→→→ 3 回目の再帰処理で呼ばれた Proc の仮引数
  x は { 77, 0 }
  y は { 22, 33, 0 }
 →→→→→→ 4 回目の再帰処理で呼ばれた Proc の仮引数
  x は { 33, 0 }
  y は { 77, 0 }
 →→→→→→→ 5 回目の再帰処理で呼ばれた Proc の仮引数
  x は { 0 }
  y は { 33, 0 }
 ←←←←←← 再帰が終わって呼び出し元(4 回目)に戻る
  x は { 33, 0 }
  y は { 77, 0 }
 ←←←←← 再帰が終わって呼び出し元(3 回目)に戻る
  x は { 77, 0 }
  y は { 22, 33, 0 }
 ←←←← 再帰が終わって呼び出し元(2 回目)に戻る
  x は { 22, 33, 0 }
  y は { 66, 77, 0 }
 ←←← 再帰が終わって呼び出し元(1 回目)に戻る
  x は { 66, 77, 0 }
  y は { 11, 22, 33, 0 }
 ←← 再帰が終わって最初の呼び出しに戻る
  x は { 11, 22, 33, 0 }
  y は { 55, 66, 77, 0 }
 ← C++ の main まで戻ってきて
  ar1 が { 11, 22, 33, 0 }
  ar2 が { 55, 66, 77, 0 }



> 配列はByValやByRefを指定しなくとも
> 参照型(ByRef)で渡されることは知っていますが

いろいろごちゃ混ぜになっているような。

ByVal / ByRef の省略の話と、配列であるかどうかは無関係ですし、
ByVal / ByRef の話と 値型 / 参照型 の話も別物ですよ。


> 後から、コードを見たときに分かりやすくするために
> 一応、付けています。

『値渡し』を望むなら、ByVal は省略しようと明示しようと、どちらでも構わないと思います。
自分の場合、新規開発ならば省略表記にした方がスッキリするので記述しませんが、
VBA からの移行であれば、明示的に記述して移植時の意図を明確にするようにしています。

一方、『参照渡し』を望むなら、VBA とは違って、ByRef を明示する必要があります。
しかし ByRef を付けた理由が「配列だから」というのなら、使い方が間違っています。


> ちなみに、普通は配列にはByValやByRefを付けないものなのでしょうか?
配列かどうかは一切関係ありません。

使い分けの方針としては、「出力引数」として実装する場合に限って ByRef を使い、
それ以外の場合は全て、値渡しとして処理させるのが普通です。

ただ、出力引数を使うことがそもそも稀であるため、.NET Framework のライブラリで見ても、
ByRef が利用されているものは殆どありません。使うとしても TryParse メソッドぐらいのものでしょう。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[11]: C++からVBへの変換 /えんえん →Re[13]: C++からVBへの変換 /774RR
 
上記関連ツリー

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
                      └ C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 14:19) #91930 ←Now
                        └ 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
                          │    └ 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

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