- ベストアンサー
構造体の動的確保について
ある変数により動的確保を行いたいのですが、構造体中の変数に対して動的確保はできるのでしょうか? struct data{ int i[30]; /*←ここの配列を動的に確保したい*/ double d[40]; /*←ここの配列を動的に確保したい*/ }data1[10]; よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> data構造体の方も動的に確保したいと考えております。 ならば data に対しても vector を使います。 #include <vector> struct data { std::vector<int> i; std::vector<double> d; data(int ni=10, int nd=10) : i(ni), d(nd) {} }; int main() { std::vector<data> data1(10); // data[0]..data1[9] .... return 0; }
その他の回答 (5)
data構造体の動的確保も同じです。ポインタにします。 struct data{ int *i; double *d; } *data1; data1 = calloc(10, sizeof(struct data)); if (data1 == NULL) { エラー処理 } data1[0].i = calloc(30, sizeof(int)); if (data1[0].i == NULL) { エラー処理 } data1[0].d = calloc(40, sizeof(double)); if (data1[0].d == NULL) { エラー処理 } data1[0].i[0] = 1; data1[0].d[0] = 1.1;
お礼
回答ありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
# ANo.#3 を受けて... C++なら可変長の配列がライブラリに用意されています。 struct data { std::vector<int> i; std::vector<double> d; data(int ni, int nd) : i(ni), d(nd) {} };
お礼
回答ありがとうございます。vectorの存在は知っていたのですが、No.1~No.3さんまでの御礼の内容にありますように、data構造体の方も動的に確保したいと考えております。 また、名前空間の使い方(私のパソコンでstdが認識できない)と、この行の内容がわからないので、勉強してみます。 data(int ni, int nd) : i(ni), d(nd) {}
- a-kuma
- ベストアンサー率50% (1122/2211)
ちょっと、質問の意図からずれるかもしれませんが c++ に手を出してみてはどうでしょう? struct data { int *i; double *d; data(); ~data(); }; data::data() { i = new int[確保したい個数(その1)]; d = new double[確保したい個数(その2)]; } data::~data() { delete [] i; delete [] d; } { /* 使うとき */ data* data1 = new data[10]; ~ } ま、確保したい個数をどう渡すか、ってことは別に考えなくちゃいけないんですが。 C の範囲だと、#2 のような感じで、いちいち malloc() するしかないんです。 { struct data { int *i; double *d; } data1[10]; int i; for (i = 0 ; i < 10 ; ++i) { data1[i].i = malloc(sizeof(int) * 確保したい個数(その1)); data1[i].d = malloc(sizeof(double) * 確保したい個数(その2)); } } と、いった感じで。 # エラー処理も入れてなければ、動作確認もしてません
お礼
回答ありがとうございます。C++は最近になって勉強し始めたのでなれていませんが、少しずつプログラムに取り入れていこうとおもっています。もし、dataの構造体も動的に確保したい場合はどうすればよいか教えてもらえないでしょうか?よろしくお願いします。
素人です 記述のしかたが古いのですけど、いちおう Borland C++ 5.5.1 で コンパイルと実行して見ました、問題ないみたいです。 #include <stdio.h> #include <stdlib.h> struct data{ int *i; /*←ここの配列を動的に確保したい*/ double *d; /*←ここの配列を動的に確保したい*/ }data1; void main() { int i; int count0,count1; count0=100; count1=200; if ((data1.i=(int *)malloc(sizeof(int)*count0))==NULL) { printf("メモリが確保できませんでした\n"); exit( EXIT_FAILURE ); } for(i=0;i<100;i++) {*(data1.i+i)=0;} if ((data1.d=(double *)malloc(sizeof(double)*count1))==NULL) { printf("メモリが確保できませんでした\n"); exit( EXIT_FAILURE ); } for(i=0;i<100;i++) {*(data1.i+i)=0;} for(i=0;i<100;i++) {data1.i[i]=i;} for(i=0;i<200;i++) {data1.d[i]=i;} for(i=0;i<100;i++) {printf("%d: %d\n",i,data1.i[i]);} for(i=0;i<200;i++) {printf("%d: %e\n",i,data1.d[i]);} } 見当はずれでなかったら嬉しいです。
お礼
回答ありがとうございます。
このような場合は、ポインタにします。 struct data{ int *i; double *d; }data1[10]; data1[0].i = calloc(30, sizeof(int)); data1[0].d = calloc(40, sizeof(double));
お礼
回答ありがとうございます。 data1の方が固定した状態ではよくわかりましたが、data構造も動的に確保するためいのですが。。。。VC++で出来る範囲で。よろしくお願いします。
お礼
回答ありがとうございます。ちゃんと実行確認をしてから、お礼の内容を書けばよかったのですが、一時の間、行うことができなくなってしまいました。一応ここで締め切らせてもらって、後ほど実行してみようと思います。 本当にありがとうございました。