C言語関係掲示板

過去ログ

No.337.構造体の構造体の構造体のメンバの参照

[戻る] [ホームページ]
No.2147

構造体の参照
投稿者---よっち(2002/07/22 23:31:59)


構造体のメンバを参照するときに「構造体変数名. メンバ名」のようにしますよね。もし、構造体の構造体の構造体のメンバのようになったら、それだけ参照するのに長い名前を使わなくてはいけませんよね。それに何度も参照するような場合は、書くのも面倒ですし、処理も遅くなるような気がします。そこで名前を置き換えて参照したいのですが、うまくいきません。どなたかご教授お願いします。
ちなみにソースはこんな感じ
struct CT {
  int as_number; 
  int cost;      
  int qos;       
};struct CM {
  int row_number;
  int row_size;  
  struct CT *cm_row[120];
}; 
struct CM cm_index[20000];


この場合、最悪な参照をしようとすると
cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number].as_number
cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number].cost
cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number].qos

ってこともあり得ますよね。(私は実際にやっているのですが、)
そこで、cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number]
までを何かに置き換えて参照したいのですが、うまくできません。
もしかしたらアホな質問しているかもしれませんが、よろしくお願いします。

No.2149

Re:構造体の参照
投稿者---かずま(2002/07/23 00:46:43)


> そこで、cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number]
> までを何かに置き換えて参照したいのですが、うまくできません。
int n = cm_index[1].row_number;
struct CT *p = &cm_index[n].cm_row[n];

p->as_number
p->cost
p->qos


No.2150

Re:構造体の参照
投稿者---かずま(2002/07/23 01:48:17)


ちょっと待ってください。struct CT *cm_row[120]; ですから、
cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number].as_number
は間違っています。
cm_index[cm_index[1].row_number].cm_row[cm_index[1].row_number]->as_number
ですね。

ということで、
int n = cm_index[1].row_number;
struct CT *p = cm_index[n].cm_row[n];

p->as_number
p->cost
p->qos


No.2152

Re:構造体の参照
投稿者---よっち(2002/07/23 03:53:41)


ご指導ありがとうございます。

実は最初に書いた構造体なんですが、実際はちょっと違うんですよ。
同じことかと思って書いた私が未熟者でした。

本当は
struct CT {
  int as_number;
  int cost;     
  int qos;      
};
struct CM {
  int row_number;
  int row_size;  
  struct CT *cm_row;
};
struct CM cm_index[20000];

cm_index[i].row_size = 120;
cm_index[i].cm_row = ct_d_array(cm_index[i].row_size);
cm_index[i].row_number = 0;

struct CT *ct_d_array(int r)
{
  return((struct CT *)malloc(r*sizeof(struct CT)));
}

として、動的にメモリを割り当てており、
cm_index[i].cm_row[cm_index[i].row_number].as_number = 1;
cm_index[i].cm_row[cm_index[i].row_number].cost = 10;
cm_index[i].cm_row[cm_index[i].row_number].qos = 100;

cm_index[as].row_number++;

のように値を入れていたのですが、どうせならcm_index[i].cm_row[cm_index[i].row_number]を置き換えられないかと模索していました。
まだ余力がありましたら、ご教授下さい。

No.2167

Re:構造体の参照
投稿者---かずま(2002/07/24 14:46:13)


> 実は最初に書いた構造体なんですが、実際はちょっと違うんですよ。

答を示すことで、やり方を教えたつもりだったのに、また答そのものを
教えて欲しいのでしょうか。

 struct CT *p = &cm_index[i].cm_row[cm_index[i].row_number];

 p->as_number = 1;
 p->cost = 10;
 p->qos = 100;

問題は、構造体のメンバーを参照したいが、その構造体を参照する式が複雑
すぎる場合、どうすれば何回も同じ事を書かなくて済むかというものですね。

答は、その構造体へのポインタを用意するというだけのことです。

No.2178

Re:構造体の参照
投稿者---よっち(2002/07/25 14:52:25)


>問題は、構造体のメンバーを参照したいが、その構造体を参照する式が複雑
>すぎる場合、どうすれば何回も同じ事を書かなくて済むかというものですね。
>
>答は、その構造体へのポインタを用意するというだけのことです。


ちゃんとできました。ありがとうございました。
私の理解不足でした。もう一度ちゃんと勉強し直します。