• ベストアンサー

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

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

noname#70509
noname#70509

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

  • ベストアンサー
回答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

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • 構造体の配列のアロケート等の方法

    基本的な事かもしれないのですが、 構造体の配列をダブルポインタで返すような関数を作成したいのですが、アロケートの仕方と、そもそも配列をダブルポインタで扱う方法が良く分かってないのかもしれません。 どなたかご教授頂けないでしょうか? Webで調べてもなかなか合ったものが見つからないため、こちらに質問させて頂きました。 イメージしているものを↓に途中まで作ってみました。これも合っていない部分があるかもですが。。。 要はアロケートして構造体の配列を作成する部分と、それをfor文で回して参照する方法が、分かっていない主なところです。 #include <stdio.h> #include <memory> typedef struct member{   int  id;   char*  name; } *member_t; int get_result(member_t *pobj) {   member_t* obj = NULL;   obj = (member_t*)malloc(sizeof(member_t));   memset(obj, 0x00, sizeof(member_t));   char* nm = NULL;   char cnmtmp[] = "nakayama";   nm = (char*)malloc(strlen(cnmtmp)+1);   memset(nm, 0x00, strlen(cnmtmp)+1);   memcpy(nm, cnmtmp, strlen(cnmtmp));   obj->id = 100;   obj->name = nm;   *pobj = obj;   return 0; } int get_resultList(member_t **ppobj) {   /*    * ココ    */   return 0; } void main() {   member_t* obj = NULL;   get_resultList(&obj);   for(int i = 0;;){     /*      * ココ      */     printf("[%d]\n",i+1);     printf("ID : %d\n", ->id);     printf("NAME : %s\n", ->name);     free( ->name);     free( );   }   free(obj); } 長々とすみません。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • ポインタ型配列のポインタを構造体のポインタ変数に格納する方法教えて!_ver2

    int型の配列は構造体のポインタ型のint型変数にはキャストすればうまくコンパイルが通りますが、同じ方法でfloat型の配列は構造体のポインタ型のfloat型変数にはキャストしてポインタの値を入れてもうまくコンパイルできず困っています。ちなみにコンパイルエラーは「互換でない型変換」と表示されます。 返答のほど、よろしくお願いいたします。 #include<stdio.h> #include<malloc.h> float time[] ={2.2, 2.3, 2.4}; int time2[] ={2, 2, 2}; struct timelist{ float *time; int *time2; struct timelist *next; }*head; void main(void) { struct timelist *p; p = (struct timelist *)malloc(sizeof(struct timelist)); p -> time = (float *)time[0]; p -> time2 = (int *)time2[0]; printf("time = %f\n", p -> time); printf("time2 = %d\n", p -> time2); }

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

  • C言語 構造体配列について

    6人分の小テストの点数を記録し,平均値などを計算するプログラムを作成している. 以下の手順と条件に従ってプログラムを作成. 手順 (1) 氏名(name[100], char 型) と点数( score , int 型) をメンバにもつ構造体「struct_TEST」を(main 関数の外で)定義. (2) struct _TEST 型構造体配列 element[6] を定義. (3) キーボードから氏名(ローマ字でよい)と点数を入力する処理を6 回繰り返す. (4) 平均点を計算して画面表示. (5) 最高点を出した人の名前と点数を画面表示. (6) 平均点に満たない人の名前と点数を画面表示. 条件 (3)~(6)の処理には以下に示す関数を利用する. (3) ・・・ 氏名と点数を入力する処理をn 回繰り返す関数 void input_score( struct _TEST *a, int n ) (4) ・・・ n 個の構造体配列に対して平均を計算し,平均点を返す関数 double calc_ave( struct _TEST *a, int n ) (5) ・・・ n 個の構造体配列に対して最高点を算出し,そのユーザの配列番号を返す関数 int calc_max( struct _TEST *a, int n ) (6) ・・・ n 個の構造体配列に対して平均点に満たない人の名前と点数を画面表示する関数 void show_under_ave( struct _TEST *a, int n ) C言語の構造体が良く分かっていません。 こういった条件が多いと考えづらく分からなくなります。 考えても分かっていないので困っています。 誰かすみませんが解答を教えて下さい。

  • 構造体配列の初期化について

    C初心者です。 宜しくお願い致します。 某社のSDKを参考にプログラムを作成しておりますが、構造体配列の初期化する方法がわからなくて困っています。 下記の構造体の初期化をしたいのですが、どのような方法で初期化すればいいかわからない状態です。 すいませんが、ご教授いただきたく宜しくお願い申し上げます。 typedef struct ioctl_videomode { V2U_INT32 width; V2U_INT32 height; V2U_INT32 vfreq; } V2U_PACKED V2U_VideoMode; typedef struct v2u_rect { V2U_INT32 x; V2U_INT32 y; V2U_INT32 width; V2U_INT32 height; } V2U_PACKED V2URect; typedef struct ioctl_grabframe2 { void * pixbuf; V2U_INT32 pixbuflen; V2U_UINT32 palette; V2URect crop; V2U_VideoMode mode; V2U_INT32 imagelen; V2U_INT32 retcode; } V2U_GrabFrame2; typedef struct { V2U_GrabFrame2* frame; char ftime[16]; }frameinfo; void main() { frameinfo fr[512]; //初期化したい →→ fr = (frameinfo*)malloc(sizeof(frameinfo)*512); } error C2106: '=' : 左のオペランドが、左辺値になっていません

  • 構造体配列のクイックソート

    こんにちわ。 構造体配列のリストを ポインタのつなぎ変えによるクイックソートで 以下のようなソートをしたいのですが、悩んでおります。 struct info { int count; struct info *prev; struct info *next; }; int main () { struct info info[5]; /* 初期値設定 */ quick_sort(info, 0, 5); return 0; } 上記のようにして、クイックソートをしたいのですが、 よくあるクイックソートだと 例えば初期値を <配列のindex>要素の値を <0> <1> <2> <3> <4> 5 1 4 3 2 などと定義した場合 普通のクイックソートだと <0> <1> <2> <3> <4> 1 2 3 4 5 というように並び変えられてしまい <配列のindex>と 要素の値の組み合わせが変わってしまいますが、 この組み合わせを変えず、 struct info *if; if = info; for (i=0; i<MAX; i++){ printf("%d", if->count); if = if->next; } printf("\n"); とすることで、indexとしては昇順になっていないが *nextをたどっていくことでちゃんと目的の値の昇順になっている というのを実現したいのですが、ポインタのつなぎ変えか何かが 間違っているようで うまいことできていません。 どなたかご教授いただけますでしょうか。 申し訳ありませんが、よろしウお願いいたします。

  • 動的配列の構造体の受け渡しについて

    動的配列の構造体の受け渡しについて教えていただきたいです。 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で作成した構造体配列の足し算をする関数を作りたいのですが、どのように記述するべきなのでしょうか。

専門家に質問してみよう