VB.NETのコードをC++に移植する

C++にboostを組み込んで,cpp_int(巨大整数)を扱うことができるようになった.さて,ここからどちらの方向に進めばよいのだろう?ELSIEは行列同型判定アプリなので,現在VBで開発している準同型検定とリンクさせることが目標ではあるが,どこをプラットフォームとすればよいのかが問題だ.ELSIEをVBから呼び出さるように作り込むという方向と,準同型検定をC++に移植するという2つの方向が考えられる.究極の目標が,NODULEを基底クラスとする統合的な処理系を作り上げることにあるとすれば,そのもっとも現実的な方向はVBを捨ててC++に乗り換えることではないか?

boostにはグラフ理論周りの関数もかなり整備されているので,うまくゆけばこれらをそっくり利用することも考えられる.準同型検定のソースは現在1200行くらいなので,移植するというプランの現実性は十分ある.VB,BETとC#の相互変換ツールというのがある.VS 2008には実装されていたようだが,すでに廃止されているが,それに替わるものがオンラインで使える可能性がある.

Telerik Code Converter
http://converter.telerik.com/

SharpDevelopというツールもある.ただし,これも新しい版では廃止されてしまっているようだ.また,対象となるプロジェクトもVS 2015までのようだ.Language Convertプラグインというのもある.これはVSのプラグインだろうか?dnSpyというツールは双方向の変換ができるようだ.IL Spyというのもあるらしい.先頭のTelerik Code Converterというのをオンラインで試してみた.ファイル1本分を黙って変換してくれた.ただし,一部に変換に失敗したところもあるようだが… 十分間に合うのではないだろうか?

C#のプロジェクトには大別して3種ある.①Windows フォームアプリケーション,②Windows フォームアプリ,③WPFアプリケーション.①t②の相違点は.NET Frameworkを使うか?.NET Core を使うかという違いだ..NET Frameworkは4.8で終了ということになっているので,将来的な問題がある.②の場合には,.NET CoreがWindowsに標準装備されていないという問題がある.③のWPFというのは最新のテクノロジーでGUIとロジックが完全に分離したものになる.

ただし,これまでのようにツールボックスからコントロールからドラッグ&ペーストなどのことができなくなり,すべてXAMLで記述しなくてはならない.③ではGDIではなくDirect 3Dが使われているので,描画はより強力なものになることが期待できる.将来的にはWindows App SDKを使うという方向性が出されており,今後どうなるかは今のところ未定である.とりあえず,①のWindows フォームアプリケーションでゆくしなかいのではないだろうか?⇒初めてのC#プロジェクトを立ち上げてみた.何とかなりそうな気配ではある.

ArrayListというクラスが未定義になった.⇒C#にもArrayListというクラスはある.⇒using System.Collections;で解消した.

private var S4の置換 = new 置換(“S4の置換”, 4);で「キーワード ‘var’ は、ローカル変数宣言内またはスクリプト コード内でのみ有効です」⇒var→置換で解消した.

「’共役変換検定’ は ‘メソッド グループ’ であるため、これに割り当てることはできません」⇒VBではファンクション名に値を代入して返すようになっているが,この方法は通用しない.C#では明示的に戻り値を返す必要がある.⇒対処した.

public static string KeyIndex(ref string[] map, string key)の戻り値がstringになっている.⇒KeyIndexには2つある.写像クラスと群クラスのものだ.Public Function KeyIndex(key As String) As Integerは群で,Shared Function KeyIndex(ByRef map() As String, key As String) As Stringは写像クラスだ.共役変換検定の中では写像クラスの関数を呼び出している.明らかにこれは誤りだ.というか,多分戻り値をintで取り出しているのが誤りなのだろう.VBのソースコードを修正しておこう.⇒いや,違う.関数定義の方が間違っている.実際のコードでは整数を返している.⇒対処した.

▲public static void Fact(object n) この関数はbigIntegerを返すものであるはずだ.⇒この関数はどこかから拾ってきたものではなかったろうか?引数も戻り値も型なしだ.とりあえず,intを引数としてintを返すものとしておく.ただし,これは巨大数になる可能性があるので,BigIntegerとした方が無難かもしれない.60!で10進81桁になる.しかし,この値は置換クラスの変数mに格納されるものなので,そこまで大きくなることを想定していないのではないか?⇒これは後で見直すことにして,ここでは保留としておく.

string[] listtop = list(0);でエラーになる.⇒list[0]なのではないか?⇒そのようだ.修正して解消した.

public void リストに登録あり(string[] list, string key)⇒戻り値の型指定なし⇒ブール値を返すように修正.

配列の初期化でエラーが出ている.string の2次元配列だ.「配列初期化子は変数かフィールド初期化子の中でのみ使用できます。new 式を使用してください。」以下のような式が通らない.

private 群 S2 = new 群(“S2”, 2, new[] { “1”, “-1” }, new[] { { “1”, “-1” }, { “-1”, “1” } });⇒new[] →new[,]として解消した.

型 ‘int’ を ‘bool’ に暗黙的に変換できません→対処した.

int rows = Information.UBound(table, 1); のような変な構文が出てきた.C#にはUBoundという関数はないのだろうか?⇒GetLength
で代用する.⇒UBoundの次元は1発進だが,GetLengthでは0発進.

「現在のコンテキストに ‘Strings’ という名前は存在しません」⇒Strings.Format→String.Format

C#ではMsgBoxがMessageBoxになる.⇒MessageBox.Showを使う.⇒エラーメッセージはe.Messageで取り出す.

エラー処理を除いてすべてのコンパイルエラーが消えた.⇒とりあえず,画面を整備して動かし始めた.

▲Permutation::Createで例外が発生する.⇒配列サイズが制限を超えている.array.Length=24となっているが,制限は13までだ.S4の乗積表を生成しようとしているのだが,S4の元は24個あるので,24!=620,448,401,733,239,439,360,000にもなり,到底カバーできない.しかし,群S4はこれまでにも生成したことはあったのではないだろうか?⇒いや,おそらくやっていないと思う.A4の群検査でハング状態になっている.A4くらいまではこなしていたような気もするのだが…

準同型検定ではほとんどログを取っていないので,進行状況がほとんど分からない.多少のところはFBに投稿していたかもしれないが… コストが掛かっているのは自己同型検定なので,もしかすると,これまでは止めてあったのかもしれない.いや,おそらくそういうことだったのではないか?ELSIEを引っ張りだしてきたのは,到底カバーできないというのが発端だったはずだ.従って,この問題を解決するには,ELSIEを整備して実用化するしかないと思う.

これで目標が定まったと言えるのではないか?

コメントを残す

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

CAPTCHA