« URGライブラリをC#で使えるようにする(2) | トップページ | bh8921@gmail.com is identified as a spam bot. »

2010年8月 1日 (日)

配列を含むC++の構造体をC#で使うには

これの続きです。

URGライブラリの構造体にはいくつか charの配列があります。C#からこの構造体を扱えるようにするために、C#のソースコード中で同じ構造体を定義してやる必要がありますが、その時この配列が、C++と同じように記述できないという問題にぶち当たりました。

例えば、urg_parameter_t という構造体は、C++では

typedef struct {
  char sensor_type[SensorTypeLineMax]; /*!< Sensor type */
  long distance_min_;                  /*!< DMIN Information */
  long distance_max_;                  /*!< DMAX Information */
  int area_total_;                     /*!< ARES Information */
  int area_min_;                       /*!< AMIN Information */
  int area_max_;                       /*!< AMAX Information */
  int area_front_;                     /*!< AFRT Information */
  int scan_rpm_;                       /*!< SCAN Information */
} urg_parameter_t;

と定義されていますが、C#で素直に

public struct urg_parameter_t {
  public byte sensor_type[SensorTypeLineMax]; /*!< Sensor type */
  public long distance_min_;                  /*!< DMIN Information */
  public long distance_max_;                  /*!< DMAX Information */
  public int area_total_;                     /*!< ARES Information */
  public int area_min_;                       /*!< AMIN Information */
  public int area_max_;                       /*!< AMAX Information */
  public int area_front_;                     /*!< AFRT Information */
  public int scan_rpm_;                       /*!< SCAN Information */
}

と記述しようとすると、この配列の部分でコンパイルエラーとなります。C#流の配列は、

public byte [] sensor_type = new byte[ SensorTypeLineMax ];

なのですが、これを構造体の中に書くとこれもコンパイルエラーです。どうにかならないかといろいろ探してみたところ、MSDNでこのような情報を見つけました。このページでは、構造体メンバの配列の要素数を設定する方法が書かれています。

それに従えば、上記の構造体はこう書けばいいわけですね。

        [StructLayout(LayoutKind.Sequential)]
        public struct urg_parameter_t
        {
            [ MarshalAs( UnmanagedType.ByValArray, SizeConst=SensorTypeLineMax ) ]
            public byte[] sensor_type;                /*!< Sensor type */
            public long distance_min_;              /*!< DMIN Information */
            public long distance_max_;              /*!< DMAX Information */
            public int area_total_;                /*!< ARES Information */
            public int area_min_;                  /*!< AMIN Information */
            public int area_max_;                  /*!< AMAX Information */
            public int area_front_;                /*!< AFRT Information */
            public int scan_rpm_;                  /*!< SCAN Information */
        }

他の構造体についても同様に書き換えて、charが使われている部分はすべてbyteに置き換えてみたところ、テスト用プログラムから

            UrgLib.urg_t   urg = new UrgLib.urg_t();
            UrgLib._urg_initialize(ref urg);

を実行しても例外が発生しなくなりました。

« URGライブラリをC#で使えるようにする(2) | トップページ | bh8921@gmail.com is identified as a spam bot. »

コメント

コメントを書く

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

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

トラックバック

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

この記事へのトラックバック一覧です: 配列を含むC++の構造体をC#で使うには:

« URGライブラリをC#で使えるようにする(2) | トップページ | bh8921@gmail.com is identified as a spam bot. »

最近の写真