- 締切済み
VC++2005MFC 入れ子構造体の使い方
VC++2005MFC typedef struct TMago{ stTestData mdata1[1000]; }stMago; typedef struct TKo{ stTestData kdata1[10000]; stTestData kdata2[10000]; stTestData kdata3[10000]; stTestData kdata4[10000]; stTestData kdata5[10000]; stMago *pMago[10000]; }stKo; typedef struct TOya{ stTestData odata1[100]; stTestData odata2[100]; stKo *pKo[100]; }stOya; stOya m_stOya;//メンバ変数 という構造体が定義されているのですが、 【Q1】 pMago、pKoのそれぞれ指定した分のメモリ確保は 例)それぞれ10個と20個分メモリ確保したい場合 for(int i = 0; i < 10; i++) { m_stOya.pKo[i] = new TOya; } とした後、 for(int i = 0; i < 10;i++) { for(int j = 0; j < 20; j++) { m_stOya.pKo[i]->pMago[j] = new TMago; } } で良いでしょうか? 【Q2】 また、これを解放するには、 同じループ処理を今度は内側から for(int i = 0; i < 10;i++) { for(int j = 0; j < 20; j++) { Delete m_stOya.pKo[i]->pMago[j]; } } for(int i = 0; i < 10; i++) { Delete m_stOya.pKo[i]; } で良いでしょうか? 【Q3】 pMago[0]の内容をpMago[1]へコピーしたい場合は memcpy(m_stOya.pKo[0]->pMago[1], m_stOya.pKo[0]->pMago[0], sizeof(TMago)); で良いでしょうか? 使い方なんてCの基本だろーですとか、そもそもこんな作りの構造体やめれば? と思われることは重々承知ですが、ご教授お願いいたしますm(__)m
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
本題は終わってるようなものなので関係ない部分だけ: 1. C++ なら, 構造体に対して typedef する必然性はあんまりないと思います. 構造体のタグ名が (曖昧でなければ) そのまま型名として使えますし. C でも, タグ名と同じ名前に typedef すれば実質的に C++ と同じような使い方ができます (が, C で「タグ名と同じ名前に typedef できる」ことを知らない人が見ると文句を言いだすかもしれん). 2. 構造体をコピーするのに memcpy する必然性は (C でも C++ でも) 全くありません. memcpy では deep copy できないので shallow copy を想定しているはずですが, それなら単純に = でいい. 特に今の場合 memcpy すると危険な状態になりえます. 3. #2 でも言われている (し自ら突っ込んでる) けど構造体のつくりがおかしい. せめて std::vector くらいは使ってほしい. 4. そもそもどこが MFC?
- maru_yoshi_
- ベストアンサー率39% (17/43)
あっ! 逆だ。 > m_stOya.pKo[0]->pMago[0] = m_stOya.pKo[0]->pMago[1]; m_stOya.pKo[0]->pMago[1] = m_stOya.pKo[0]->pMago[0];
- maru_yoshi_
- ベストアンサー率39% (17/43)
【Q1】 > m_stOya.pKo[i] = new TOya; m_stOya.pKo[i] = new TKo; だろう。 for(int i = 0; i < 10;i++) { m_stOya.pKo[i] = new TKo; for(int j = 0; j < 20; j++) { m_stOya.pKo[i]->pMago[j] = new TMago; } } とすればいい。 【Q2】 for(int i = 0; i < 10;i++) { for(int j = 0; j < 20; j++) { delete m_stOya.pKo[i]->pMago[j]; } delete m_stOya.pKo[i]; } 【Q3】 NG m_stOya.pKo[0]->pMago[0] = m_stOya.pKo[0]->pMago[1]; とする。
- kmee
- ベストアンサー率55% (1857/3366)
Cなら new 演算子も delete 演算子も無いのが「基本」なので,Q1,Q2は間違い。malloc,callocで確保してfreeで解放するのが基本。 C++なら、Q1は「間違いではない」。 Q2はDeleteという演算子は標準には無いので間違い。deleteなら、Q1との組合せなら「間違いではない」 Q3は「間違いとは言いきれないが、stTestDataの定義によっては問題が起こる場合がある」 詳細は「浅いコピー」「深いコピー」で検索。memcpyでは浅いコピーになります。 また、(C++でoperator =を定義してなければ)単に *(m_stOya.pKo[0]->pMago[1]) = *(m_stOya.pKo[0]->pMago[0]) でもいいはず。 ただ、御自身でおっしゃるように > そもそもこんな作りの構造体やめれば? と思いますよ。 「10個確保」とかいうのを見ると、 odata1が100個、 odata2が100個、 *pKOが100個 がワンセット、というよりは {odata1、odata2、*pKO}のセットが100個(または必要な数) という感じではないですか?
- asuncion
- ベストアンサー率33% (2127/6289)
>使い方なんてCの基本 C++じゃなくって、本当にCですか? >stTestData これの定義は、どこにありますか?
補足
すいません、C++です。 定義は、 typedef struct TTestata{ CString str1; CString str2; CString str3; }stTestData; です。 よろしくお願いいたしますm(__)m