« 2学期の受講科目登録申請 | トップページ | 次は地磁気センサだ »

2010年8月17日 (火)

配列のマーシャリング

お盆休み中、実家に帰っている間に本年度の開発構想書をUpdateしていました。しかし、PPTファイルを開きっぱなしで作業をしていてちゃんとセーブしておかなかったため、またもや悲劇が起こりました。私が知らない間にノートPCが勝手にWindows Updateを実行してPCを再起動しており、計画を練り直した分を失って、モチベーションが下がりまくりでした。

第2回の走行実験も残り20日を切ったので、とりあえず9/4までの計画を惹きなおして開発再開です。そして、今日はやっと、このあたりや、このあたりで書いていた、DLL化したURGライブラリをC#から呼び出すことに成功して、URGで計測した距離データを取得できるようになりました。といっても、未解決な問題点はまだまだありますが・・・。

今日一番悩んだ部分は、Cの関数で引数に配列がある場合、C#で配列をどのようにマーシャリングするかです。具体的には、DLL用のプロトタイプ宣言が次のような関数があります。

int  APIENTRY _urg_receiveData (urg_t *urg, long data[], int data_max);

これをC#から呼び出すためにはどうしたらよいか。答えはこうでした。

[DllImport("UrgLibDll.dll")]
public static extern unsafe int _urg_receiveData(ref urg_t urg, [In] int[] data, int data_max);

そして、使い方はこう。

n = UrgLib._urg_receiveData(ref urg, data, data_max);

わかってしまえばなんてことはないのですが、MSDNのこの説明が理解できなくてずっと悩んでました。

« 2学期の受講科目登録申請 | トップページ | 次は地磁気センサだ »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/49175797

この記事へのトラックバック一覧です: 配列のマーシャリング:

« 2学期の受講科目登録申請 | トップページ | 次は地磁気センサだ »

最近の写真