それはそれとして、シミュレーションプログラムにて、条件を変えてのシミュレーションが増えてきました。で、毎度パラメータを書き換えてビルドし直すのも手間なので、パラメータは外部から与えられるようにしようかなと画策中。
その変更自体はどうってことないのですが、どうせやるならコマンドラインではなくGUIで変えたいところ。デフォルト値とか設定しておけるしね。
で、GUI作るなら.NETが楽でいいじゃろーと思って、C#で組もうかと思ったのですが、内部のルーチンはネイティブのC++で動かさないと遅いわけで、はてどうしようかと。
MSとしては、高速に動作させたい部分はネイティブのC++で、GUIは.NETでと考えているらしいです。で、その橋渡しをするのがC++/CLIというわけらしい。C++/CLIならマネージドな部分とアンマネージドな部分を混在できます。
と、一応知っては居たのですが実際どんな風に記述して、どういった挙動を取るのか分からなかったので、こないださわりだけやってみました。
いや、あれすっごく面白いですね。VC++2005EEにて、Win32で作っていたプロジェクトのプロパティの
「共有ランタイムを使用しない」となっている箇所を
「共有ランタイムを使用(/clr)」
に変更する(文言は間違ってるかも。うろ覚え)。たったこれだけ。
ソースコードに何ら変更を行うことなく、CLRでのコンパイルが通りました。実行も問題なし。速度の劣化もありませんでした。
なので、これがホントにCLRなの?とか思って、疑問に感じたのでできあがったバイナリをLinuxのMonoを使って動かしてみました。
その結果、ある意味実行成功。FFTWのDLLを使用しているため、Linuxでそのまま動くわけはありません。ですので、実行が失敗するのは予想通り。ただ、ちゃんと実行可能なバイナリとしてMonoが認識していました。つまり、CLRとして認識されていたと言うことですね。すげー!
これでネイティブC++からC++/CLIへ変換できたので、プロジェクトにWindowsフォームを追加して表示だけさせてみました。これまたあっけなく成功。
ただ、コンソールアプリのプロジェクトだったので、フォームを表示した次の瞬間にプログラムが終了してしまい、フォームが表示しきる前に固まってました^^; Disposeしてないからかも。今のプロジェクトにフォームを追加するより、GUIアプリのプロジェクトを作って、今のシミュレーションプログラムのソースとかをコピーして追加してやる方がよさげやな。ま、それはすぐできると思われます。
ここまではとんとんと進んだのですが、まだ理解できてない部分もちらほら。アンマネージドな配列データなどをマネージドな配列に渡すにはどうしたらよいのか、その辺がよく分かってなかったりします。
ぢつはNPlotのライブラリを使ってグラフでも表示できたらおもすれーよなーと思ってやろうとしたんですよ。けど、
System::Int32 a[] = {1, 2, 3, 4};
plot2Dsurf.DataSource = a; // ここでコンパイルエラー
と言うようなコードを書いたところ、
「^System::Int32型をSystem::Object型にキャストできません」
みたいなエラーが出たんですよね。訳分からん・・・。ここいらがキモになりそう。マネージドな部分とアンマネージドな部分とのデータのやりとりというか、変換処理の仕方が分かったら、C++だけでGUIも作れそうだ。
いやー、こう考えたらC++/CLIのポテンシャルってすっげー高いよなと思う。高速な部分は今まで通りのC++で書けばいいし、GUIの部分はマネージドなライブラリを利用してささっと書けばいい。
こりゃちょっと、勉強して使えるようになっておこうかしら。今のところC++/CLIに対応したコンパイラはMSしか出してないけれど、標準規格とするみたいだからコンパイラは自由に作れるようだし、Linuxでも使えるときが来るかも知れない。
いずれにせよ、面白い言語だわ。俄然興味がわいて来ましたよ^^
0 件のコメント:
コメントを投稿