昔、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;
}
No.3
- 回答日時:
> ところで、マネージ開発はあまりしないということは、 ...
特に他意はないのですが私の仕事がマネージ環境をあまり意識したものを扱わないからということです
VB.NETやC#でプログラムを書いたりもしますが C++でってことは殆んど無いんです
いずれは やらなくちゃいけないんでしょうけど ...
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] );
}
}
といった具合かと思います
# マネージ開発はあまりしないので間違ってるかも知れませんが
この回答への補足
ありがとうございます。
若干修正し、コンパイルすると動作しました。
マネージ型について望んでいた通りのものでした。
ところで、マネージ開発はあまりしないということは、
マネージ開発のメリットが少ないため、まだまだアンマネージ開発?が主流と読み取りますが、マネージ型のデメリットは何なのでしょうか?
速度が遅いだけなのでしょうか?
アンマネージ型のソースも見たいですが、これは普通の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] );
}
}
}
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
3つの連想配列を交互に代入し...
-
PHPで連想配列のプルダウンメニ...
-
foreachで上限回数指定方法また...
-
Excel VBAでフィルター後の対象...
-
PHP、{}記号の意味
-
ftokが動かない?
-
関数をの引数について。
-
phpでforeachの中にforeachがあ...
-
リストボックス複数選択抽出方法
-
プログラミングのPythonのnoteb...
-
プルダウンメニューにDBの内容...
-
file_existsでファイル名の部分...
-
PHPのmin関数、「1」以上の数値...
-
スカラーのベクトル微分
-
Perlで重複行を削除したい
-
特定の文からメールアドレスの...
-
MySQLのデータをPHPで多次元...
-
配列をループでたくさん宣言し...
-
数独かを判断するプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マッチング処理(1:N)
-
smartyのforeachの使い方
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
VB.NET で 二次元のハッシュは...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
POSTで渡されるデータの数がわ...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
Delphi XEの警告文を消したい
-
配列から順位を算出したい
おすすめ情報