ページ 11

構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月21日(日) 22:58
by ジーラ(初心者)

コード:

typedef struct{
   char word[20];
   int kaisu;
}node;
 node wordh[1000];
上の構造体のwordに『yyy』、kaisuuに『1』を入れたものを1000個用意したいのですが、どうすればよいのか分かりません。
教えてください。

Re: 構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月21日(日) 23:40
by かずま
先頭 1個だけ初期化して、それをコピーすればよいのでは?

コード:

#include <stdio.h>

typedef struct {
    char word[20];
    int kaisu;
} node;

node wordh[1000] = { { "yyy", 1 } };

void init_wordh(void)
{
    for (int i = 1; i < 1000; i++) wordh[i] = wordh[0]; 
}

int main(void)
{
	init_wordh();
	printf("wordh[0] = { %s, %d }\n", wordh[0].word, wordh[0].kaisu);
	printf("wordh[999] = { %s, %d }\n", wordh[999].word, wordh[999].kaisu);
}

Re: 構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月21日(日) 23:50
by かずま
マクロを使えば、1000個の初期値を数行で書けますよ。

コード:

#include <stdio.h>

typedef struct {
    char word[20];
    int kaisu;
} node;

#define T2 { "yyy", 1 }
#define T1 T2,T2,T2,T2,T2,T2,T2,T2,T2,T2
#define T  T1,T1,T1,T1,T1,T1,T1,T1,T1,T1

node wordh[1000] = { T, T, T, T, T, T, T, T, T, T };

int main(void)
{
	printf("wordh[0] = { %s, %d }\n", wordh[0].word, wordh[0].kaisu);
	printf("wordh[999] = { %s, %d }\n", wordh[999].word, wordh[999].kaisu);
}

Re: 構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月22日(月) 01:15
by ジーラ(初心者)
for分で繰り返すというところまでは浮かんでいたのですが、上手く行かず悩んでいたのです。
一つだけ初期化してコピーという発想はありませんでした。
マクロもそんな使い方があるとは知りませんでした。色々と勉強になりました。
ありがとうございました。

Re: 構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月22日(月) 09:17
by かずま
ジーラ(初心者) さんが書きました:
6年前
for分で繰り返すというところまでは浮かんでいたのですが、上手く行かず悩んでいたのです。
for分ではなく、for文ですね。

上手く行かないとはどんな状態なのですか。
また、どんなコードを書いてみたのですか?
普通は誰でも次のように書くと思いますが、
もっとうまい書き方があれば知りたかったいということでしょうか?

コード:

	for (int i = 0; i < 1000; i++) {
		strcpy(wordh[i].word, "yyy";
		wordh[i].kaisu = 1;
	}

Re: 構造体配列の全てを同じ値で初期化したい。

Posted: 2019年7月23日(火) 20:08
by Math
ANSI C 以降 以下のてんで集成体型をまとめて(スカラーのように)扱うことが可能なので積極的に使うべきです。

・構造体の一括代入
・構造体を関数の引数として渡す
・構造体を関数の引数として返す
・auto変数の初期化

初期のCには存在しなかった機能です。