• 締切済み

C++/CLIでネイティブの構造体を使用したい

すみません。C++の初心者です。 C++/CLIフォームアプリケーションで関数の呼出し画面を作成しています。 既にある(C++ネイティブで作成済み)のヘッダファイルをプロジェクト上にコピー、追加して ヘッダファイル内に書かれている構造体を使用したいのですが、 出来ないのでしょうか? ヘッダファイル(xxx.h)内には以下のような構造体が作成されています。 typedef struct { double pq_base; int iter_max; double eps; int chi_set_flg; int bad_rmv_flg; int obs_slk_flg; int obs_before_flg; int calc_pf_flg; double *chi_val_95_0; double *chi_val_97_5; double *chi_val_99_0; }s_SE_SET; C++/CLIのプロジェクト内にこのヘッダファイルを追加して フォーム内のあるボタンを押された時に、この構造体を参照させてあげたいのですが、 以下の様に構造体変数を定義して s_SE_SET se_set; ビルドを行うと以下のエラーが出ます。 error C4368: 'se_set' をマネージ 'se_project::Form1' のメンバーとして定義できません。 混合型はサポートされていません C++/CLIではネイティブで定義された構造体は使用出来ないのでしょうか? なにか方法が有るとすればその方法を教えて頂けると嬉しいです。 どなたかご教授頂けませんでしょうか。 よろしくお願い致します。

みんなの回答

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.3

ini_seの第2引数の型はs_SE*じゃないでしょうか。 とすると、seの型は、s_SE*なので、少なくとも第2引数は ret = ( ??? , se , ??? , ??? , ??? ); ではないでしょうか。

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.2

マネージクラスはネイティブクラスのオブジェクトをメンバーにもてません。 ただしポインタはメンバに持てますのでメンバ定義では s_SE_SET* se_set; としておき、コンストラクタで se_set = new s_SE_SET; ファイナライザで delete se_set; のようにすればネイティブのクラスを使うことができます。

freeman_asy
質問者

お礼

ありがとうございます。 お教え通り記述してビルドしてみたところ次の様なエラーが出ました。 error C2664: 'ini_se' : 2 番目の引数を 'cli::interior_ptr<Type>' から 's_SE *' に変換できません。(新しい機能 ; ヘルプを参照) with [ Type=s_SE * ] マネージ型をアンマネージ型に変換できません。 やってみたことは、フォーム名のヘッダファイル(mainfrm.h)内の ボタンクリックの処理に以下を記載しました。 /********************************/ /* 実行ボタン処理 */ /********************************/ private: System::Void cmd_実行_Click(System::Object^ sender, System::EventArgs^ e) { /*=============================*/ /* ファイル読込み */ /*=============================*/ ret = SE_OK; *list_file_name = "file_name.txt"; out_file_name[FILE_NAME_LEN]; //コンストラクタ se = new s_SE; <--ここを追加 se_set = new s_SE_SET; <--ここを追加 se_out = new s_SE_OUT; <--ここを追加 ret = ini_se( list_file_name, &se, &se_set, &se_out, out_file_name ); また、構造体変数定義は以下です。 private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> System::ComponentModel::Container ^components; //構造体定義 s_SE* se; <--ここを追加 s_SE_SET* se_set; <--ここを追加 s_SE_OUT* se_out; <--ここを追加 ネイティブのC++で作成したヘッダファイルに記載されている s_SE_SET 等は 何も触っていません。 よろしくお願い致します。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

このページに対応策が書かれています。 http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html

freeman_asy
質問者

お礼

ありがとうございます。 確認してみます。

関連するQ&A