ページ 11

構造体の初期化について

Posted: 2008年9月23日(火) 13:42
by デンマーク
質問があります。
C言語の構造体の初期化についてですが
最初は※1のようにすれば構造体のメンバが全部初期化
されると思っていましたが、data_set[SIZE]の配列は
SIZE分だけ初期化する必要があるそうなのですが
どうすればいいのかわかりません。
どなたかアドバイスお願いします。
環境はボーランドを使っています。

typedef struct {
  long data_set[SIZE];
long data_head;
long data_number;
long data_new;
long data_index;
long data_count;
long data_location ;
}DATA;

DATA data_data;//変数を使うために宣言 DATAは型でdata_dataは変数

void init(void)//初期化
{
DATA data_data = { 0,0,0,0,0,0 };※1 初期化
}

Re:構造体の初期化について

Posted: 2008年9月23日(火) 13:45
by ibis
{{0, 0,・・・}, 0, 0, ・・・}
みたいに。

Re:構造体の初期化について

Posted: 2008年9月23日(火) 17:32
by box
変数 data_data を、関数の外で定義したいのですか?
それとも、init 関数の中で自動変数として定義したいのですか?
どちらの方法を採りたいかによって、明示的な初期化が
必要かそうでないかの違いがあります。

Re:構造体の初期化について

Posted: 2008年9月23日(火) 18:57
by デンマーク
 すいません。。
 説明不足でした。
 変数 data_data を、関数の外で定義します。。
 
 そして{{0, 0,・・・}, 0, 0, ・・・} のようにも
 考えたのですがSIZEのところをfor文で回したいと考えています・・

Re:構造体の初期化について

Posted: 2008年9月23日(火) 19:06
by box
関数の外で定義するのであれば、明示的な初期化を行なわなくても
当該構造体の全メンバー(配列かどうかは無関係)をゼロで初期化します。

Re:構造体の初期化について

Posted: 2008年9月23日(火) 19:14
by フリオ
> void init(void)//初期化
> {
> DATA data_data = { 0,0,0,0,0,0 };※1 初期化
> }

 この場合だと、全てのメンバを 0 で初期化するなら、

DATA data_data = {0};

でいいです。
 

Re:構造体の初期化について

Posted: 2008年9月23日(火) 21:19
by ななしさん
一般的に構造体をとにかく0で初期化したいときは
ZeroMemory(data,sizeof(data))を使います
これがエラーを吐くようならmemset(data,0,sizeof(data))を利用してください

Re:構造体の初期化について

Posted: 2008年9月23日(火) 21:30
by box
ZeroMemory は Win32API に属しているんですよね?
ということは、環境によって使えない場合がありますので、
一般的とはいえないと思います。

一方、memset は C言語の標準関数です。
おそらくすべての Cコンパイラーで使えるはずです。

したがって、どちらが一般的かといえば、memset の方です。

Re:構造体の初期化について

Posted: 2008年9月23日(火) 21:39
by たかぎ
構造体のメンバがすべて整数型であれば実質的な問題はありませんが、ZeroMemoryであろうがmemsetであろうが、そのような方法でゼロクリアするのは一般的とはいえません。
http://www.kijineko.co.jp/tech/supersti ... emset.html

一般的には、

DATA data_data = {0};

が正解です。

Re:構造体の初期化について

Posted: 2008年9月24日(水) 00:24
by デンマーク
 なるほど!!
 ありがとうございます。
 
 DATA data_data = {0}; でOKのようですね。
 またなにかあったら宜しくお願いします