アプリ版:「スタンプのみでお礼する」機能のリリースについて

昔、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;
}

A 回答 (3件)

> ところで、マネージ開発はあまりしないということは、 ...


特に他意はないのですが私の仕事がマネージ環境をあまり意識したものを扱わないからということです

VB.NETやC#でプログラムを書いたりもしますが C++でってことは殆んど無いんです
いずれは やらなくちゃいけないんでしょうけど ...
    • good
    • 0

マネージ型にするなら


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

この回答への補足

ありがとうございます。
若干修正し、コンパイルすると動作しました。
マネージ型について望んでいた通りのものでした。

ところで、マネージ開発はあまりしないということは、
マネージ開発のメリットが少ないため、まだまだアンマネージ開発?が主流と読み取りますが、マネージ型のデメリットは何なのでしょうか?
速度が遅いだけなのでしょうか?

アンマネージ型のソースも見たいですが、これは普通の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] );
}
}
}

補足日時:2007/08/09 08:31
    • good
    • 0

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

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