C#の2次元配列をC++に変換する

まず,MatrixIsomorphismの引数をMatからint[,]に変えておこう.⇒引数に int[,]が使えない.昨日見た記事では確かにできるようになっていたと思うのだが…

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/arrays

確かに,以下のような構文は認められている.

static void Print2DArray(int[,] arr)

ただし,これはC#の話だ.C++で可能かどうかは,また別の話になる.C++では最初の次元の要素数しか省略できない.ただし,下記のような呼び出しは可能なようだ.

int sum_all2(int size1, int size2, int arr[size1][size2])

ダメだ.コンパイルエラーになる.「C99だとこんな書き方ができるんだそうな」とあるのだが… 

https://qiita.com/Hiraku/items/babed27bc1d750c2e12d

C99というのは,1999年規格ということだから当然搭載されているものと思われるのだが… 以下の構文ならよいという記事があった.

static void sub_func( int (*a)[]

http://murakan.cocolog-nifty.com/blog/2011/08/cc-b731.html

確かにこの文は通る.ただし,アドレス計算を自前でやらなくてはならないというのが欠点だ.C++ではarrayとvectorが使えるはずだが,これらはどうなっているのだろう?arrayはサイズ固定の配列だが,vectorは可変長なのでこちらの方が使い易い可能性はある.どちらも多次元配列を作ることはできる.将来的には文字列を要素とする行列なども扱うようになる可能性があるので,arrayないしvectorを使うのが上策なのではないだろうか?処理速度ではarrayの方が速い.

配列サイズが変化するということはあまりなさそうだし,変化した場合にはそれなりの対処策もあるので,arrayを使うというのが現時点では妥当なのではないだろうか?なぜだろう.ElsieProject.hでデータ・タイプ arrayを宣言できない.同じブロックで関数の引数としてなら使えているのだが… 下記の構文なら一応通る.

int MatrixIsomorphism(int N, std::array<std::array<int, 12>, 12> m1);

しかし,

int MatrixIsomorphism(int N, std::array<std::array<int>> m1);

は通らない.以下は通った.

int MatrixIsomorphism(int N, std::vector<std::vector<int>> m1);

しかし,この形式ではC#で定義に使えない.c#にもVectorというのはあるが,これは「倍精度実数の対」というまったく別物だ.C#とC++をシームレスに繋ぐとしたら,今のところint[,]しかないのではないか?⇒C#の配列[,]はC++では読めない.やはり,マーシャリングが必要なようだ.ゼルコバの木ではこのようなときにどうしていたのだろう?ゼルコバの木には2次元配列というのはなかったかもしれない…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA