• ベストアンサー

構造体の中でユーザー定義型の型を使いたい 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; }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

マネージ型にするなら 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] );   }  } といった具合かと思います # マネージ開発はあまりしないので間違ってるかも知れませんが

binma
質問者

補足

ありがとうございます。 若干修正し、コンパイルすると動作しました。 マネージ型について望んでいた通りのものでした。 ところで、マネージ開発はあまりしないということは、 マネージ開発のメリットが少ないため、まだまだアンマネージ開発?が主流と読み取りますが、マネージ型のデメリットは何なのでしょうか? 速度が遅いだけなのでしょうか? アンマネージ型のソースも見たいですが、これは普通の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] ); } } }

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> ところで、マネージ開発はあまりしないということは、 ... 特に他意はないのですが私の仕事がマネージ環境をあまり意識したものを扱わないからということです VB.NETやC#でプログラムを書いたりもしますが C++でってことは殆んど無いんです いずれは やらなくちゃいけないんでしょうけど ...

  • maku_x
  • ベストアンサー率44% (164/371)
回答No.1

私は 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; }

関連するQ&A