質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3778閲覧

[C言語]static変数の配列の初期化で全ての要素を一括に初期化したい

takey

総合スコア312

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/08 02:57

編集2018/11/08 03:08

C言語で、staticな配列の初期化をしたいです。

まず以下のコードを見てください。

C

1#include <stdio.h> 2#define NUM 2 3typedef enum _BOOL { FALSE = 0, TRUE } BOOL; 4 5void hoge(int num){ 6 static BOOL is_hoge[NUM] = {FALSE, FALSE}; 7 8 printf("%d\n", is_hoge[num]); 9 10 if (!is_hoge[num]){ 11 is_hoge[num] = TRUE; 12 } 13} 14 15int main(void){ 16 // Your code here! 17 int num = 0; 18 hoge(num); 19 hoge(num); 20} 21

やりたいこととしては、NUMの値を2から変更してもis_hoge配列の全ての要素をFALSEで初期化できるようにしたいです。

現状は

C

1static BOOL is_hoge[NUM] = {FALSE, FALSE};

というようにFALSEを2個書いていますが、NUMの値が2から3に変更したとき、is_hoge[2]は0で初期化されてしまいます。これを明示的にFALSEで初期化したいです。

たとえば次のように変更したとき

C

1static BOOL is_hoge[NUM] = {};

is_hoge配列の要素は全て0で初期化されますが、そうではなくFALSEで初期化する方法が知りたいです。

もちろんFALSEは0なので問題はないのですが、もし方法として存在するのなら知りたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/11/08 03:04

「static is_hoge」と型がないのですが、これはBOOLを意図したものでしょうか?
takey

2018/11/08 03:07

そのとおりです。失礼しました。修正しました。
guest

回答2

0

泥臭いですが、こういう書き方もあります。

c

1#define NUM 2 2typedef enum _BOOL { FALSE = 0, TRUE } BOOL; 3 4void hoge(int num) { 5 static BOOL is_hoge[NUM]; 6 static BOOL is_first = TRUE; 7 8 // is_hogeの初期化(一度だけ) 9 if (is_first) { 10 is_first = FALSE; 11 for (int i = 0; i < NUM; i++) { 12 is_hoge[i] = FALSE; 13 } 14 } 15 16 printf("%d\n", is_hoge[num]); 17 18 if (!is_hoge[num]){ 19 is_hoge[num] = TRUE; 20 } 21}

投稿2018/11/08 04:30

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2018/11/08 09:27

まさにやりたいことはそれです。やりたいことに対して処理が大げさになってしまうのが難点ですねぇ…。
guest

0

ベストアンサー

C言語の範囲では、列挙型も整数型であるので、staticなものの初期化で初期値を与えない場合、0で初期化されます(列挙内に0がない場合ですらそうなりました)。

C言語の範囲内で行おうとすれば、Boost Preprocessorのような手法で、マクロ展開で必要な個数のFALSEを生成することになるかと思います。

投稿2018/11/08 03:19

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2018/11/08 09:33

Boost Preprocessorは初めて知りました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問