• ベストアンサー

データ数の多い構造体配列

メンバが配列である構造体配列を定義したいのですが、 struct hei { double *hight=(double*)malloc(sizeof(double) * 2*max + 1); }; int main() { struct hei h[10]; : : : という風にはできないのでしょうか。 「構文エラー : ';' が '=' の前にありません」とエラーが出てしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

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++でクラスを使わないなど、ご飯の無いチャーハンに等しい!)

noname#70509
質問者

お礼

回答ありがとうございます。 C++は勉強したことがなかったのですが、 これを機に勉強してみようと思います。

その他の回答 (5)

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.6

初心者はmallocを使いたがるけど最後まで開放しなかったりとか ほとんど無意味なことが多いです。

回答No.5

 こんにちは。  既出の通りです。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; }

noname#70509
質問者

お礼

回答ありがとうございます。 しかもプログラム付きで…… C++は勉強したことがなく、正直避けていたのですが、 勉強してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

C++ だったら std::vector<double> とか std::valarray<double> とかを使う方が楽だと思います. あえて茨の道を進みたいなら止める義理はありませんが. ちなみにいまどき malloc.h はないと思う.

noname#70509
質問者

お礼

回答ありがとうございます。 C++勉強してみます!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

できない.

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>struct hei >{ >double *hight=(double*)malloc(sizeof(double) * 2*max + 1); >}; コンストラクタを定義してその中で hight を初期化して下さい。

関連するQ&A