プロが教える店舗&オフィスのセキュリティ対策術

すみません。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ではネイティブで定義された構造体は使用出来ないのでしょうか?
なにか方法が有るとすればその方法を教えて頂けると嬉しいです。

どなたかご教授頂けませんでしょうか。
よろしくお願い致します。

A 回答 (3件)

ini_seの第2引数の型はs_SE*じゃないでしょうか。



とすると、seの型は、s_SE*なので、少なくとも第2引数は

ret = ( ??? , se , ??? , ??? , ??? );

ではないでしょうか。
    • good
    • 1

マネージクラスはネイティブクラスのオブジェクトをメンバーにもてません。



ただしポインタはメンバに持てますのでメンバ定義では

s_SE_SET* se_set;

としておき、コンストラクタで

se_set = new s_SE_SET;

ファイナライザで

delete se_set;

のようにすればネイティブのクラスを使うことができます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
お教え通り記述してビルドしてみたところ次の様なエラーが出ました。

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 等は
何も触っていません。

よろしくお願い致します。

お礼日時:2012/11/02 10:01

このページに対応策が書かれています。


http://www.atmarkit.co.jp/fdotnet/special/vcppin …
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/02 09:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!