- ベストアンサー
構造体の中でユーザー定義型の型を使いたい TurboC → VC++2005
昔、TurboCで作ったソースをVC++2005に置き換えようと難儀しています。 以下、構造体の中でユーザー定義型の型を使いたいのですが、 方法がわからず困っています。 ソースは途中で、コンパイルエラーになりませんが、肝心な所は コメントになっています。 詳しい方、教えていただけますか? /* 昔の古い構造体を VC++2005で使いたいです。 typedef struct _Test1{ char key[128]; char val[10]; } Test1; typedef struct _Test2{ char key[128]; Test1 val[10]; } Test2; */ #include <memory.h> using namespace System; using namespace System::Runtime::InteropServices; // テンプレート?でcharやshort型の配列はできるみたいです。 template<typename TYPE, size_t size> [StructLayout(LayoutKind::Sequential, Size=sizeof(TYPE) * size)] public value struct native_array{ TYPE elem; property TYPE default[int] { TYPE get(int index) { pin_ptr<TYPE> p = &this->elem; return p[index]; } void set(int index, TYPE value) { pin_ptr<TYPE> p = &this->elem; p[index] = value; } } }; public ref struct Test1{ String^ key; native_array<char, 10> val; Test1(){ key = "test1だよ"; pin_ptr<char> p = &this->val.elem; array<char>^ data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; pin_ptr<char> dat = &data[0]; memcpy(p, dat, sizeof(this->val)); } }; public ref struct Test2{ String^ key; // charやshortなどでなく、ユーザー定義型のTest1の型を // 配列として10個確保したい // 記述方法がわかりません。 Test2(){ key = "test2だけど、test1の型を使いたいです。"; // 記述方法がわかりません。 } }; int main(array<String^>^ args){ Test1 test1; Test2 test2; // Test1 Console::WriteLine(test1.key); for (unsigned i = 0; i < sizeof(test1.val) / sizeof(test1.val[ 0 ]); ++i) { Console::WriteLine(test1.val[ i ].ToString()); } // Test2 Console::WriteLine(test2.key); // 記述方法がわかりません。 return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
マネージ型にするなら public ref struct Test1 { String^ key; array<char^> ^val; Test1(){ key1 = "Test1だよ"; val = gcnew array<char^>(10); for( int n=0; n < val.Length; n++ ) { val[n] = (char)(n + 1); } } } public ref struct Test2 { String^ key; array<ref struct Test1^> ^val; Test2() { key = "test2だけど、test1の型を使いたいです。"; val = gcnew array<ref struct Test1^>(10); for( int n = 0; n < val.Length; n++ ) { val[n] = gcnew Test1; } } } といった具合の宣言・コンストラクタではないかと思います main側では Test1 test1; Test2 test2; int n = 0, m= 0; Console::WriteLine( test1.key ); for ( n = 0; n < test1.val->Length; n++ ) { Console::WriteLine( test1.val[n] ); } Console::WriteLine( test2.key ); for ( n = 0; n < test2.val->Length; n++ ) { Console::WriteLine( test2.val[n]->key ); for ( m = 0; m < test2.val[n]->val->Length; m++ ) { Console::WriteLine( test2.val[n]->val[m] ); } } といった具合かと思います # マネージ開発はあまりしないので間違ってるかも知れませんが
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
> ところで、マネージ開発はあまりしないということは、 ... 特に他意はないのですが私の仕事がマネージ環境をあまり意識したものを扱わないからということです VB.NETやC#でプログラムを書いたりもしますが C++でってことは殆んど無いんです いずれは やらなくちゃいけないんでしょうけど ...
- maku_x
- ベストアンサー率44% (164/371)
私は Visual C++ は分かりませんので、標準の C++(STLは使用)で書きますが、構造体はクラスで置き換えることができれば、従来の記法にこだわる必要は無いと思います。 (記述例) #include <iostream> #include <vector> using namespace std; const int ARRAY_SIZE_T1=10; const int ARRAY_SIZE_T2=3; class Test1 { string key; vector<char> val; public: // コンストラクタ Test1(char c_array[]) { key = "test1だよ"; copy( c_array, c_array + ARRAY_SIZE_T1, back_inserter(val) ); } // 出力 void print(void) { vector<char>::iterator it; cout << "'" << key << "', ("; for ( it=val.begin(); it!=val.end(); it++ ) { cout << *it << ","; } cout << ")" << endl; } }; class Test2 { string key; vector<Test1> val; public: // コンストラクタ Test2() { char t_array[ARRAY_SIZE_T2][ARRAY_SIZE_T1] = { { '0', '1', '2', '3', '4', '5', '6', '7', '7', '9' }, { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' }, { 'K', 'L', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U' } }; key = "test2だけど、test1の型を使いたいです。"; // ここは何を処理したいかによって記述方法が異なる。 // 以下はサンプル。 copy( &t_array[0], &t_array[ARRAY_SIZE_T2], back_inserter(val) ); } // 出力 void print(void) { vector<Test1>::iterator it; cout << "'" << key << "'" << endl; for ( it=val.begin(); it!=val.end(); it++ ) { (*it).print(); } } }; int main(void) { Test2 test2; // Test2 test2.print(); return 0; }
補足
ありがとうございます。 若干修正し、コンパイルすると動作しました。 マネージ型について望んでいた通りのものでした。 ところで、マネージ開発はあまりしないということは、 マネージ開発のメリットが少ないため、まだまだアンマネージ開発?が主流と読み取りますが、マネージ型のデメリットは何なのでしょうか? 速度が遅いだけなのでしょうか? アンマネージ型のソースも見たいですが、これは普通のTurboCで動作させる typedef struct _Test1{ char key[128]; char val[10]; } Test1; typedef struct _Test2{ char key[128]; Test1 val[10]; } Test2; で動作させるものでしょうか? //VC++2005 マネージ型 using namespace System; public ref struct Test1 { String^ key; array<char^> ^val; Test1(){ key = "Test1だよ"; val = gcnew array<char^>(10); for( int n=0; n < val->Length; n++ ) { val[n] = (char)(n + 1); } } }; public ref struct Test2 { String^ key; array<ref struct Test1^> ^val; Test2() { key = "test2だけど、test1の型を使いたいです。"; val = gcnew array<ref struct Test1^>(10); for( int n = 0; n < val->Length; n++ ) { val[n] = gcnew Test1; } } }; int main( array<String^>^args){ Test1 test1; Test2 test2; int n = 0, m= 0; Console::WriteLine( test1.key ); for ( n = 0; n < test1.val->Length; n++ ) { Console::WriteLine( test1.val[n] ); } Console::WriteLine( test2.key ); for ( n = 0; n < test2.val->Length; n++ ) { Console::WriteLine( test2.val[n]->key ); for ( m = 0; m < test2.val[n]->val->Length; m++ ) { Console::WriteLine( test2.val[n]->val[m] ); } } }