• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++の構造体について。)

VC++の構造体について

このQ&Aのポイント
  • VC++の構造体についての質問
  • 要約文章2
  • 要約文章3

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

  • ベストアンサー
  • 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