delegateとかアンマネージとかあまり関係有りませんでした、すみません。Releaseモードだとオブジェクトの生存期間が変わってしまうのが原因でした。基本的には以下のページと同様の現象です。http://blogs.wankuma.com/shuujin/archive/2007/05/15/76794.as…
前回の記事の件で訂正。もう少し探っていくと、2重のdelegateでなくとも単にアンマネージ関数に空のdelegateを渡すだけでも落ちていました。お手上げ状態なのは相変わらずです。GCが発動すると落ちるということしかわかっていません。そのアンマネージ関数と…
言葉では説明しにくいので、すごく端折ったコードで書くとこんな感じです。即席で書いているので間違っていたらすみません。C++側の実装 (hoge.dll) typedef void (_cdecl *CallbackA)(void); typedef int (_cdecl *CallbackB)(int a, int b); extern "C" __…
今までリポジトリはCodeReposにありましたが、ここ1週間かけてsvnsyncを敢行し、GoogleCodeに移しました。以前からOpenCvSharpはGoogleCodeとCodeReposの2つのページがあってよくわからない状況になっていました。これには事情があって、最初はCodeReposで、…
前回の記事の逆変換の場合を考えていきます。基本的に、ポインタに変換するよりはコーディングは楽です。
色々方法はあります。これから、思いついたものを列挙していきます。
C#使っているくせにポインタが絡むことばかりやっていて、なんだかなあと思う今日この頃。 C# unsafeコード中でのヌルポインタについて。C/C++では、NULLすなわち0という整数値をそのままポインタ変数に代入できましたが、C#は型にうるさいのでできません。…
C#では base というキーワードで継承元のクラスのメンバにアクセスできます。では継承元の元はどうするか、つまり base.base.Hoge(); のようなことがやりたいという場合のお話です。しかし残念ながらbaseは繋げて書けません。
窓の外を見て驚き、カレンダーを確認して再度驚き・・・ようやく微妙に桃色になってきた木と雪景色とのミスマッチ。
は、どうも無理っぽいです。そりゃそうだと納得するしかないですが。 System.Core.dllを参照に加えたうえで、こんなコードを書いてみます。VB.NETでの拡張メソッドの定義に準じたつもりです。 public ref class MyExtensions abstract sealed { public: [Sys…
おかげさまで行数が天井知らずに増えております。あとはcxcoreの方をやればほぼ終わったも同然になります。終わった暁には、XMLドキュメントコメントが日英両対応という素敵な状態になります。コンピュータビジョン ―アルゴリズムと応用―作者: Richard Szeli…
char* と System::String^の変換の方法の備忘録。Visual C++ 2008から使用可能になったmarshal_asとmarshal_contextを使うと、Marshal::StringToHGlobalAnsiなどを使うよりも若干楽ができます。 char* -> String^ #include <msclr/marshal.h> using namespace msclr::interop;</msclr/marshal.h>…
C#で作ったDLLからC++/CLIで作ったDLLを呼び出すと、FileNotFoundExceptionが発生して、このところ途方にくれていました。 FileNotFoundExceptionというと、読み込むテキストファイルや画像ファイル等がないときに発生するというイメージでしたが、これはDLL…
Convex Hullは日本語では凸包と訳されます。平面上の点がいっぱいあったとき、その一番「外側」の点を結んでできた線です。 cvConvexHull2の返り値のCvSeqから凸包の頂点を取り出す際、2重ポインタ(CvPoint**)が出てくるためその扱いに苦慮しています。今の…
あるIntPtrの変数ppに、構造体Tのポインタのポインタ、つまりC言語でいうところのT**が入っていたとします。このポインタからunsafeを使わずに実体の値を得る方法です。 確認までに、C言語ではこうなります (ppの型はT**とする)。 T t = **pp; C#(というか.…
この前の春休みに帰省した時の写真をいくつか。 家の中から撮ったリスです。見かけること自体は日常茶飯事で、たぶん毎日出没してるので気を付けていればかなりの確率で見られるのですが、ここまでどアップで撮れたのは初めてです。 あとおまけ、帰り道で通…
少し前に要望が有ったので、組み込んでみました。まだ進捗は半分程度といったところですが、サンプルは動きました。 ソースはこのような感じです。ほぼcvblob付属のtest.cppの直訳です。 using (IplImage img = new IplImage("shapes.png", LoadMode.Color))…
C#で書き直していましたがおそらく全て終わりました。拡張メソッドを使うことで結構省力化できたように思います。大体C++/CLI実装と互換性はあるんじゃないかと思いますが、やや変えてる部分はあります。 また、なんとコミッタさんが現れたため、未実装の関…
以下のコードはコンパイルが通りません。doubleはstructですし、ifの中はTがdoubleの時しか絶対に実行されないので良さそうなものですが、ダメです。 T Hoge<T>() where T : struct { if(typeof(T) == typeof(double)) { double r2 = 1.41421; return r2; } els</t>…
のですが、いい方法はないものか・・・・。 とかのタグにlang="ja"とかあったらなあと思いましたがあるわけもなく。 思いついたのはこんな方法です。 #if LANG_JP /// /// 日本語 /// /// 正の数 #elif LANG_DE /// /// Deutsch /// /// eine positive Zahl …
C#でC/C++のライブラリのラッパークラスを作るときの基本形は、こんな感じになると思います。 class HogeWrapper : IDisposable { IntPtr ptr; public HogeWrapper() { ptr = createHoge(); } public void Dispose() { releaseHoge(ptr); } [DllImport("hoge…
※追記:.NET Framework4以降における方法 http://schima.hatenablog.com/entry/2013/10/08/003445現在OpenCvSharpをC#メインで書き直し中です。C++/CLIに比べるとVisualStudioの支援が手厚く、コンパイルも圧倒的に速いので作業効率は良いです。しかしラッパ…
id:Schima:20090228 で、C++/CLIにてinitonlyにより定数っぽいもの(readonly)を定義する方法をご紹介しましたが、やはり厳密な意味での定数ではないために困ることがあります。この方法では、コンパイル時に定数が必要な場合には使えません。 例えばenumの初…
最近プログラムを書いていてちょっと納得いかなかったことをいくつか。
CvSeqを使う関数は何かとラッパー的に面倒なので避け気味なのですが、頑張って実装しました。最近たまっていた分を含めてリリースしておきました。Sandcastleのバージョンを上げたので、以前よりもヘルプが見やすくなっていると思います。 以下の画像はOpenC…
C#でアンマネージな関数を使いたければ、DllImportを使うのが常道です。しかし、定義の際に必ずstaticをつけることからもわかるように、静的な定義であり、プログラムの実行中に動的に関数名を決めてロード、といったことはできません。C/C++ではWin32APIのL…
だいぶ前に書いたちょっとしたメモのせいで、このブログに「C/C++/C# 動的配列」といったキーワードで飛んでくる方が結構いるみたいです。大して書いてなくて申し訳ないので勉強兼ねてまとめときます。
cvFindStereoCorrespondenceBM, cvFindStereoCorrespondenceGCのほかに、cvauxの方にもcvFindStereoCorrespondenceという関数があります。こちらもラップしてみました。 http://opencv.jp/opencv-1.1.0/document/opencvref_cvaux.html#decl_cvFindStereoCorr…
こちらのページの関数をすべてラップしました。まだリリースはしてません。 http://opencv.jp/opencv-1.1.0/document/opencvref_cv_epipolar.html cvFindStereoCorrespondenceBMとcvFindStereoCorrespondenceGCを試しに動かしてみました。先ほどのOpenCVリフ…
クラスのメンバに定数を、すなわちpublicでstaticでconstな値を定義するとします。C++的な考えでC++/CLIで定義してみるとこうなるでしょう。 public ref class Const abstract sealed { public: static const Int32 HOGE = 123; }; しかしこれをC#側から定義…