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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ジーラ(初心者)

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

#1

投稿記事 by ジーラ(初心者) » 1ヶ月前

コード:

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

かずま

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

#2

投稿記事 by かずま » 1ヶ月前

先頭 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: 構造体配列の全てを同じ値で初期化したい。

#3

投稿記事 by かずま » 1ヶ月前

マクロを使えば、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: 構造体配列の全てを同じ値で初期化したい。

#4

投稿記事 by ジーラ(初心者) » 1ヶ月前

for分で繰り返すというところまでは浮かんでいたのですが、上手く行かず悩んでいたのです。
一つだけ初期化してコピーという発想はありませんでした。
マクロもそんな使い方があるとは知りませんでした。色々と勉強になりました。
ありがとうございました。

かずま

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

#5

投稿記事 by かずま » 1ヶ月前

ジーラ(初心者) さんが書きました:
1ヶ月前
for分で繰り返すというところまでは浮かんでいたのですが、上手く行かず悩んでいたのです。
for分ではなく、for文ですね。

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

コード:

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

Math

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

#6

投稿記事 by Math » 1ヶ月前

ANSI C 以降 以下のてんで集成体型をまとめて(スカラーのように)扱うことが可能なので積極的に使うべきです。

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

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

返信

“C言語何でも質問掲示板” へ戻る