- 締切済み
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
- ya-cha
- お礼率68% (184/268)
- C・C++・C#
- 回答数5
- ありがとう数0
- みんなの回答 (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% (2126/6288)
>使い方なんてCの基本 C++じゃなくって、本当にCですか? >stTestData これの定義は、どこにありますか?
関連するQ&A
- C++:構造体:newで入れ子:deleteは?
C++で以下のような構造体を使っています。(本当は他にもメンバが有ります) // ----- typedef struct{ int *npMember; }Test_t; // ----- これをクラスのメンバ変数で // ----- Test_t *m_tpTestStruct; // ----- とし、関数の中で // ----- m_tpTestStruct = new Test_t[10]; for (int i = 0; i < 10; i++) { m_tpTestStruct[i].npMember = new int[100]; } // ----- というようにメモリを割り当てています。 これを解放する時は、 // ----- for (int i = 0; i < 10; i++) { delete [] m_tpTestStruct[i].npMember; } delete [] m_tpTestStruct; // ----- で、良いのでしょうか? それとも、他の書き方が必要なのでしょうか?
- ベストアンサー
- C・C++・C#
- 入れ子の構造体について
例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?
- ベストアンサー
- C・C++・C#
- 入れ子になった構造体について
以下のように定義した、2重に入れ子になった構造体があります。 これを、mallocを使ってエリアを確保した後、初期化しています。 例では、各構造体の項目数が少ないのですが、 項目が増えた場合、下記のような初期化方法だと面倒だと思います。 もっとよい方法があるのだろうと思っているのですが・・・。 下記は私の試行錯誤結果なので、「普通はこうやるんじゃないの?」という方法などがあればご教授願います。 /* -- 構造体定義 -- */ typedef struct { char data[16] ; }D_TAG ; typedef struct { char name[16]; D_TAG *d ; }F_TAG ; typedef struct { char name[16] ; F_TAG *f ; }T_TAG ; /* -- 変数定義 -- */ T_TAG *t ; /* -- エリア確保 -- */ t=(T_TAG*)malloc(sizeof(T_TAG)*10); for(i=0;i<10;i++) { t[i].f=(F_TAG*)malloc(sizeof(F_TAG)*10); for(j=0;j<10;j++) { t[i].f[j].d = (D_TAG*)malloc(sizeof(D_TAG)*10); } } /* -- 初期化 -- */ for(i=0;i<10;i++) { memset(t[i].name , 0x00, sizeof(t[i].name)); for(j=0;j<10;j++) { memset( t[i].f[j].d, 0x00, sizeof(D_TAG)*10); memset( t[i].f[j].name , 0x00, sizeof(t[i].f[j].name)); } } よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 動的配列の構造体の受け渡しについて
動的配列の構造体の受け渡しについて教えていただきたいです。 typedef struct{ int class; int **matrix; }pattern_struct; という構造体を用意しました。 メイン側で int main(){ pattern_struct *sample,*prototype; 省略 for(k=0;k<9;i++){ for(i=0;i<height;i++){ for(j=0;j<width;j++){ prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j]; } } for(i=0;i<height;i++){ for(j=0;j<width;j++){ prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j]; } } ~9まで続きます~ } 省略 } 少し変えていますが、このようなプログラムを記述しました。 記述を省略するためにmallocで作成した構造体配列の足し算をする関数を作りたいのですが、どのように記述するべきなのでしょうか。
- ベストアンサー
- C・C++・C#
- ポインタ・構造体・並び替え
http://www9.plala.or.jp/sgwr-t/c/Q/ens15-3.html ↑のページの問2のプログラムを #include <stdio.h> typedef struct data{ int number; int subject[4]; int sum; }data_t; int get_sum(data_t); int main(void) { data_t st[5]={{1001,85,74,63,90}, {1002,78,65,70,62}, {1003,89,92,88,76}, {1004,32,48,66,25}, {1005,92,76,81,98}, }; data_t *p; data_t q; int i,j; for(i=0;i<5;i++) { p=&st[i]; p->sum=get_sum(st[i]); } for(i=0;i<3;i++) { for(j=0;j<3-i;j++) { if((p+j)->sum<(p+j+1)->sum) { q=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=q; } } } for ( i = 0; i < 5; i++ ) { printf( "%4d ", ( p+i )->number ); for ( j = 0; j < 4; j++ ) printf("%4d ", ( p+i )->subject[j] ); printf( " %4d\n", ( p+i )->sum ); } return 0; } int get_sum(data_t data) { data_t *p=&data; int i,sum=0; for(i=0;i<4;i++) { sum+=p->subject[i]; } return sum; } と、作ってみたのですが、最高点の1005が一番上に来るけど、それ以外が正しく表示されません。 どこを直せばいいでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ポインタと構造体
C言語初心者です。 下のコードはリスト構造のサンプルコードを元に自分で書き直そうとしているコードです。(なので、現時点では不完全なところ(例えばfreeしてないとか)があるのと、自分で理解出来ていない箇所があります。) 実行すると、8から3までの値が一応表示されるようになったですが、その過程の仕組みが自分でもよく理解出来ていません。 (1)tra *q = NULL; 通常、構造体のポインタを使用するときはq = &___のように他の構造体のアドレスを渡して使用出来るようにすると思いますが、ここではなぜ*qに、NULLを代入する必要があるのでしょうか。 (2)そのNULL状態のポインタqを関数printingdudeに突っ込んで結果的に8、7、6、、と出力されるまでの過程がよくわかりません。簡単に解説して頂けると助かります。(ちょっと雑な質問になってしまい申し訳ありません) typedef struct transcript{ int no; struct transcript *next; } tra; void printingdude(struct transcript *m); tra* noud(int v, tra* c); int main(){ tra *q = NULL; int i; for(i = 8; i>1; i--){ printingdude(q); q = noud(i, q); } return; } void printingdude(struct transcript *m){ if(m ==NULL) return; printf("%d\n", m->no); } tra* noud(int v, tra* c){ tra *a = (tra *) malloc(sizeof(tra)); a->no = v; a->next = c; return a; }
- ベストアンサー
- C・C++・C#
- 構造体の入れ子が構造体の場合のextern宣言について
えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;; typedef struct __test001 { int arg; } _test001; typedef struct _body { _test001 test001; } body; body useful; この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?
- ベストアンサー
- C・C++・C#
- C言語で、引数が構造体の場合
生徒の名前、点数、順位を表示するプログラムをつくりたいのですが、(下のような関数を用いることを前提として) void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } このような場合、関数の引数として、構造体が用いられているわけですよね? 引数が構造体の場合、どのように引数の部分を書けばいいのか分かりません。 私が考えたプログラムは下記の通りです。 もちろんうまくいきませんでした。 たぶん最後のprintfの所のrank1の引数が間違っているだけだと思うんですが、どうでしょうか? include<stdio.h> struct data { char name; int score; int rank; }; void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } void main(void) { int m; static struct data x[] = {{'A',56,1}, {'B',79,1}, {'C',34,1}, {'D',91,1}, {'E',69,1}}; for(m=0;m<5;m++) printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m)); }
- ベストアンサー
- C・C++・C#
- 構造体の動的確保について
ある変数により動的確保を行いたいのですが、構造体中の変数に対して動的確保はできるのでしょうか? struct data{ int i[30]; /*←ここの配列を動的に確保したい*/ double d[40]; /*←ここの配列を動的に確保したい*/ }data1[10]; よろしくお願いします。
- ベストアンサー
- C・C++・C#
補足
すいません、C++です。 定義は、 typedef struct TTestata{ CString str1; CString str2; CString str3; }stTestData; です。 よろしくお願いいたしますm(__)m