- ベストアンサー
データ数の多い構造体配列
メンバが配列である構造体配列を定義したいのですが、 struct hei { double *hight=(double*)malloc(sizeof(double) * 2*max + 1); }; int main() { struct hei h[10]; : : : という風にはできないのでしょうか。 「構文エラー : ';' が '=' の前にありません」とエラーが出てしまいます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
struct hei { double *hight=(double*)malloc(sizeof(double) * 2*max + 1); }; CでもC++でも、構造体内での代入式は使えません。 (VC++2008 の C++言語の場合 static const int ならばできますが・・・) この例の場合、malloc を使う意味が無いですね。 (max は定数と仮定してます) struct hei { double hight[2 * max + 1]; }; 動的に確保するなら。 // C言語の場合 // C言語の構造体にコンストラクタはありませんのでmainで確保します。 #include<malloc.h> #define max 20 struct hei { double *hight; }; void main(void) { struct hei h[10]; unsigned int i; for(i=0; i<10;i++) { h[i].hight=(double*)malloc(sizeof(double) * 2*max + 1); } } // C++言語の場合(既に↓↓の方が書かれていますが) #include<malloc.h> #define max 20 struct hei { double *hight; hei() { hight=(double*)malloc(sizeof(double) * 2*max + 1); } }; void main() { hei h[10]; } ※普通構造体にはメソッドを持たせません! struct ではなく class で定義します。 (C++でクラスを使わないなど、ご飯の無いチャーハンに等しい!)
その他の回答 (5)
- eroermine
- ベストアンサー率18% (83/444)
初心者はmallocを使いたがるけど最後まで開放しなかったりとか ほとんど無意味なことが多いです。
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 既出の通りです。std::vector<T>等を利用するが得策です。 如何してもmalloc/calloc等で推し進めるのなら、コピーコンストラクタ、代入演算子、デストラクタを書かなければなりません。 でないと、簡単に壊れてしまいます。大体此れ位は必要になります。 struct hei { int size; double *hight; explicit hei(int max = 10) : size(std::max(max, 0/*1*/)), hight(_S_allocate(size)) { } hei(const hei& r) : size(r.size), hight(_S_allocate(size)) { std::copy(r.hight, r.hight + r.size, this->hight); } ~hei() { free(hight); } hei& operator = (const hei& r) { if(this == &r)return *this; if(!this->hight && !r.hight)return *this; if(this->size != r.size) //右手側に合わせて自分をリサイズしないといけない this->hight = static_cast<double*>(realloc(this->hight, _S_byte_size(this->size = r.size))); std::copy(r.hight, r.hight + this->size, this->hight); return *this; } static int _S_byte_size(int size){ return (sizeof(double) * 2) * size; } static double* _S_allocate(int size){ return size ? static_cast<double*>(malloc(_S_byte_size(size))) : 0; }//サイズ0でmallocが1個分割り当てるのを防ぐ }; int main(void) { hei h[10]; hei a(5), b(0); cout << a.size << endl; cout << b.size << endl; a = hei(15);//サイズ5にサイズ15を代入 cout << a.size << endl; b = hei(350);//サイズ0にサイズ350を代入 cout << b.size << endl; for(int i = 0; i < 10; ++i) { cout << h[i].size << endl; h[i] = hei(0); //サイズ0で潰す cout << h[i].size << endl; } return 0; }
お礼
回答ありがとうございます。 しかもプログラム付きで…… C++は勉強したことがなく、正直避けていたのですが、 勉強してみます。
- Tacosan
- ベストアンサー率23% (3656/15482)
C++ だったら std::vector<double> とか std::valarray<double> とかを使う方が楽だと思います. あえて茨の道を進みたいなら止める義理はありませんが. ちなみにいまどき malloc.h はないと思う.
お礼
回答ありがとうございます。 C++勉強してみます!
- Tacosan
- ベストアンサー率23% (3656/15482)
できない.
- koko_u_
- ベストアンサー率18% (459/2509)
>struct hei >{ >double *hight=(double*)malloc(sizeof(double) * 2*max + 1); >}; コンストラクタを定義してその中で hight を初期化して下さい。
お礼
回答ありがとうございます。 C++は勉強したことがなかったのですが、 これを機に勉強してみようと思います。