VC++の構造体について

このQ&Aのポイント
  • VC++の構造体についての質問
  • 要約文章2
  • 要約文章3
回答を見る
  • ベストアンサー

VC++の構造体について。

テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず、C++とC++/CLI、ネイティブ(アンマネージ)型とマネージ型の違いをはっきりさせましょう。 structは従来のC++での構造体です。ネイティブになります。 マネージ型は、.NET frameworkの部分になるので、「C#をC++風に書く方法」くらいに考えていいと思います。 > 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません > マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 とあるように、ネイティブのclassの中にマネージ型のメンバを入れたり、その逆をしたりはできません。 このままで使いたければ、マネージ型にすることです。 ref class line_test {~ または value class line_test {~ refとvalueの違いとか、その他の詳しい説明は「値型 参照型」で調べてください。C#向けに書いてあるものの方がいいかもしれません。 ネイティブなstructとして使いたいなら、HomeBankやForm1の中に書かないことです。そして、String,arrayも使わないで、C++ネイティブな方法で書くことです。 これとは別の話ですが > typedef struct _line_test_{ ... }line_test; C++では、typedefを使わなくても、 struct line_test{ ... }; で、 line_test l ; 等と利用できます。classと一緒です。

diy_sunny
質問者

お礼

回答頂きありがとうございます。だいぶ返事が遅くなり申し訳ありません。教えて頂いた”ネイティブ型”と”マネージ型”の違いというのを教えて頂いてから、自分が結構このことに関するエラーに遭遇していることがよくわかりました。 マイコン関係のC言語で数年前からやっているので、それを元にプログラムを書いたときに”文字列”のStringとかを扱ったことがなくいろいろと悩みました。 マイコンのC言語でやっていた構造体のやり方でデータをまとめておきたいというやり方がクラスというやり方に似ていると最近思うようになりまして、その際にマネージとか、ネイティブの話が役立ちました! 助かります。

その他の回答 (1)

回答No.2

何かしら動くサンプルが無いと手がかりが無い状態かも知れませんので、 ネイティブなC++環境でテキストを行単位読み取りし、単純に最大行数が 予測可能と仮定して構造体メンバーの文字列配列に格納するサンプルを 書いてみました。WIN32のEXEプロジェクトを作成する時に余計なライブ ラリを使わない「空のプロジェクト」を選択してください。 行単位操作というのは意外と面倒な操作になりますのでCOMオブジェクト を使っていますが、CreateFileとReadFileでも同様な操作は可能です。 //================================================================================================= //VC++ 非マネージコードによるTEXTファイル行単位読み取りと構造体格納 //programed by hidebou #include <windows.h> #include <comdef.h> #undef GetFreeSpace #import "scrrun.dll" auto_rename //TEXTを行単位で保持する構造体 struct _TEXT{_bstr_t Line[0xff];}TEXT; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { _bstr_t Path = __FILE__; //__FILE__ マクロは自身(cppファイル)のパスに展開される try { CoInitialize(NULL); //Scripting.FileSystemObjectによりTextStreamを生成する Scripting::IFileSystem3Ptr FileSystem("Scripting.FileSystemObject"); Scripting::ITextStreamPtr Stream = FileSystem->OpenTextFile(Path, Scripting::ForReading, false, Scripting::TristateFalse); int index = 0; //行単位で構造体のLine配列へ格納 while(!Stream->AtEndOfStream) TEXT.Line[index++] = Stream->ReadLine(); Stream->Close(); //格納されたTEXTをMessageBoxで表示 for(long c = 0; c < index; c++) MessageBox(NULL, TEXT.Line[c], _bstr_t(_variant_t(c + 1)) + " Line", MB_SYSTEMMODAL); } catch(_com_error e) { MessageBox(NULL, e.ErrorMessage(), NULL, MB_SYSTEMMODAL); } CoUninitialize(); return(0); }

diy_sunny
質問者

お礼

回答頂きありがとうございます。struct _TEXT{_bstr_t Line[0xff];}TEXT;  このようにして、そこに全部入れるってこともできるんですね。実際のプログラムを作成して頂きありがとうございました!

関連するQ&A

  • vc2005.net 構造体の宣言について

    visual studio(VC++) .net 2005マネージを練習しています。 クラス内に構造体を作りたいのですがうまくいきません。 public ref class Form1:~~ 上記クラス中で public: static STRUCTTEST test = gcnew STRUCTTEST; 上記のように記述したところ '^'この間接指定を型STRUCTTESTで使用出来ません。 と出ます。 マネージだから'^'で良いのではないでしょうか。 ^をとったところ testをマネージtestslusion::Form1のメンバとして定義できません。混合型はサポートされません。 と出ます。マネージでは^が必要なはずなのでこれは分かるのですが・・・。 gcnewをnewにしても^を*にしてもコンパイルエラーが出ます。 これは何故でしょうか。 ちなみに配列を static array<int>^ test = gcnew array<int>(10); このように記述する事は分かりました。

  • VC++2010で配列を使用する方法

    String ^test[10]; とすると 1>d:\documents and settings\my documents\visual studio 2010\projects\Form1.h(233): error C2728: 'System::String ^' : ネイティブ配列はこのマネージ型を含むことはできません とエラーが出ます どのようにすれば良いのでしょうか?

  • 構造体の静的な初期化

    構造体の静的な初期化で、初期化が書かれていないメンバーは、 どうなるのでしょうか。。? たとえば・・・ // 構造体の宣言 strcut MY_STRUCT {    int data1 ;    int data2 ;    int data3 ;    int data4 ; } ; // 変数宣言&初期化 static strcut MY_STRUCT st = {    .data1 = 100,    .data3 = 300 } ; ネットで調べると、 初期化で指示されていないメンバーは0に初期化される、 という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか? それともコンパイラ依存の仕様でしょうか?

  • .NET Frameworkのクラスのみで書いたプログラムをマネージアプリケーションと呼ぶのでしょうか?

    Visual C++ の .NET 2003で開発しております。 マネージとアンマネージについて質問です。 マネージアプリケーションとは、「.NET Framework」のクラスライブラリ郡群のみで構成されたプログラム、という解釈で合ってますでしょうか? (Visual C++ .NETプログラミングテクニック 田中正造著より) 「Windows フォーム アプリケーション(.NET)」で作成したプロジェクトで、「System.String」のクラスを使用したところ、「System.String」はアンマネージです…といったエラーが頻発してしまい、この解釈が間違っているのかと思い、質問させて頂きたく思います。 「__gc」キーワード付きでclass宣言したところ、エラーは出なくなりました。 アンマネージと__gcの関係などもあるのでしょうか? ヘルプを探ってみても見付かりませんでした…。 もし、詳しい方いらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。

  • VC++「オブジェクト参照がオブジェクト・・・・

    Stringで2次元配列をやりたいと思っているのですが、 array<array<String^>^>^ addr_eeprom02; このような宣言をしたのですが、 次のようなプログラムを実行使用とすると addr_eeprom02[cnt_test][1] = data->Substring( 1, 8 ); ビルドは通ったのですが、デバッグしていくと 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出ます。 解決方法などありませんでしょうか?

  • __gcクラスから、__nogcクラスの構造体を使おうとするとLNK2020エラーが出ます

    NET 2003 C++ のマネージとアンマネージに関する質問です。 「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、 ビルドができません。 構造体を持つクラスの指定を「__gc class」に指定すると、ビルドが通るようになります。 これはどういった理由なのでしょうか? マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか? 利用できるように改善する方法がございましたら、お教えいただけますと幸いです。 何卒よろしくお願いします。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • VC++で、DateTime型の変数の配列を作りたい

    初歩的な質問ですが、よろしくお願いします。 単純に DateTime 取引日[3]; と、すると  error C2728:'System::DateTime' : ネイティブ配列はこのマネージ型を含むことはできません というエラーになります。 どうすればいいのでしょうか?

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

  • C++ Point構造体について

    Point型の配列を作成したいのですが、うまくいきません。 Point^ myArray[] = {  gcnew Point(20, 100),  gcnew Point(40, 150),  gcnew Point(60, 125),  gcnew Point(40, 100),  gcnew Point(60, 75),  gcnew Point(40, 50) }; error C2728: 'System::Drawing::Point ^' : ネイティブ配列はこのマネージ型を含むことはできません となり、コンパイルが通らず、困っています。 アドバイスよろしくお願い致します。

専門家に質問してみよう