• ベストアンサー

静的変数の大量な要素を初期化したい

言語:c OS:Windows XP 処理系:Borland C++ Compiler 5.5 静的変数の大量な要素を-1で初期化したいのですが、 どのようにかけばよいでしょうか。 static int a[1000] = {-1, -1, /* ←これをたくさんかくしかないでしょうか */

質問者が選んだベストアンサー

  • ベストアンサー
  • colder
  • ベストアンサー率43% (30/69)
回答No.2

#define X10(X) X,X,X,X,X,X,X,X,X,X static int a[1000] = { X10(X10(X10(-1))) }; こんな感じでいかがでしょうか

otaks
質問者

お礼

ご回答ありがとうございます。 マクロを上手く使うんですね。 こんなこともできるのだと感心しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • thamansa
  • ベストアンサー率40% (95/232)
回答No.8

回答がいくつも集まっているなか「いまさら」で恐縮ですが、 質問の対象は「関数内で定義するstatic変数」のことでよろしいでしょうか。 C言語のstatic変数と紛らわしいものに、static外部変数とC++のstaticメンバ変数がありますので・・・ static int aaa=-1; /* static外部変数 */ void func(){   static int bbb=-1; /* これがstatic変数*/ } class Foo{   static int ccc; // C++のstaticメンバ変数 }; static int Foo::ccc=-1; // C++のstaticメンバ変数

otaks
質問者

補足

やりたかったのは上から2つ目の 関数の中のstatic変数です。 >void func(){ >  static int bbb=-1; /* これがstatic変数*/ >}

全文を見る
すると、全ての回答が全文表示されます。
回答No.7

-1, を1000回書く(printfとかfprintf) するプログラムを書いて それを #include はどうでしょう?

otaks
質問者

お礼

よりスマートな方法を探しています。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> 処理系:Borland C++ Compiler 5.5 の場合、memsetはそんなに高速ではありません。 ここは、mainの最初の辺りで、 for (i = 0; i < 1000; i++) a[i] = -1; とするのが、速度的にも、サイズ的にも、また移植性の面でも、最適だと思うのですがいかがでしょうか?

otaks
質問者

補足

静的変数なのですが、この方法で値を設定することは 可能なのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • R32C
  • ベストアンサー率39% (115/290)
回答No.5

ご質問は、変数の初期化方法ではなく、初期値を持つ変数の定義方法に ついてだと思います。 解答というより、改善案として3つの方法がよいかと思います。 1)未初期化変数として、プログラムの最初で初期化   memset(a,-1,sizeof(a)); #  すでに解答済みのものと同じですが 2)定数定義にする。   const static int a[1000] = {-1, -1, /* ひたすら書く*/ /* #defineで簡易に書いても可能*/ 3)アセンブリ言語で書く(質問のカテゴリーと違ってますが)   data セグメントを指定して DUPというのを使う   例)(コンパイラのプリフィックスが_の場合)   _a: dd 1000 dup (-1) 理由については、PCレベルの場合はあまり関係ないかもしれませんが (組込みでは、重要だと思います) 速度とメモリ効率のため3つ提案しています。 初期化変数の場合は、main()にくるまでのスタートアップと呼ばれる部分で 初期化します。そのときにコンパイラによりますが、ROM領域に設定データ を定義したものからmemcpy相当の処理を行ないます。(ROM領域というより、 固定データ領域) ですので、1)の方が速く、固定データ 領域も使いません。 この辺はコンパイラによるので、ひょっとしたら、同一データとしてmemset をする賢い処理系があるかもしれません。 さらに、もし、初期化データを変更しない場合は、constといれれば、 ローディング時にプログラムと同様に初期化されるので、プログラム上で処理されない ため、速度的に有利に、さらに(貴重な?)RAMは使用されなくなります。 最後3)のアセンブリ言語を使う場合はローディング時に初期化されます。最もリソースが 少なくて済む場合です。DUPで、繰り返し定義ができるようです。 指示命令(擬似命令ともいう)はプロセッサ依存ではなく、アセンブラ依存つまり 処理系依存ですが、NASM32では、DUPは使えるようです。URLからダウンロードできるようです。

参考URL:
http://www.codingcrew.de/masm32/index.php
otaks
質問者

お礼

アセンブラは私の扱える範囲を超えています・・ 後ほど確認しようと思います。 ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

単純に memset( a, -1, sizeof(a)); でいいと思います。 64Bit環境を考慮する場合は、 32Bitと64Bitでは-1の値が以下の用に異なるので、 比較などに-1を使用する場合は気をつけたほうが良いです。 32Bitでは、 0xFFFFFFFF 64bitでは 0xFFFFFFFFFFFFFFFF

otaks
質問者

補足

これは値を書き換えているように見えますが、 初期化以外のところで、このようなことは可能なのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

memset(a,0xff,sizeof(a)); として下さい。 これは、int型の -1が0xffffffff であることを利用したものです。 但し、全てのコンパイラでこの方法が通用するとは、限りませんので、 その点のみ、考慮して使用するなら、問題ないでしょう。

otaks
質問者

補足

これは値を書き換えているように見えますが、 初期化以外のところで、このようなことは可能なのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

>static int a[1000] = {-1, -1, /* ←これをたくさんかくしかないでしょうか */ そうです。

otaks
質問者

お礼

ご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語のグローバル変数の初期化について

    C言語において int a = 1; // 動的グローバル変数 static int b = 2; //静的グローバル変数 funcA(){ int c = 3; // 動的ローカル変数 static int d = 4; //静的グローバル変数 ・ ・ ・ } 上記のように各種変数を初期化したとします。 "c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね? では ・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか? ・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか? 以上2点について伺いたいと思います。 ちなみに、組み込み機器むけのソフトウェアを想定しています。

  • static 変数について

    static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }

  • 変数の初期値

    へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

    • ベストアンサー
    • Java
  • 関数外からstatic変数を再度初期化できるのでしょうか?

    以下の静的変数?についてA,Bのメモリは別でしょうか? test関数外からBの変数を再度初期化できるのでしょうか? staticの仕組みがわからないのでstaticのメモリの初期化のタイミングとメモリアクセス方法について知りたいです。 static x = 1; // ---A int test() { static int x = 0; // --- B } またexternの働きも知りたいです。

  • staticで初期化した変数(?)を使って初期化

    次の3つのプログラム、1番目はコンパイルエラーになりますが、下2つはエラーになりません。1番目のプログラムのエラーメッセージ:初期化子が定数ではありません。 処理系にかかわらずそうだとしたら、その理由はなんでしょうか。 ---------------------------------- int main(void) { static int a=5; static int b=a; return 0; } ---------------------------------- int main(void) { static int a=5; int b=a; return 0; } ---------------------------------- int main(void) { int a=5; int b=a; return 0; }

  • \fはどのように使うのでしょうか。

    言語 :c 処理系:Borland C++ Compiler 5.5 OS  :Windows XP Home c言語でエスケープシーケンスの\fを試しても 上手く機能してくれません。 使い方が間違っているのかも分かりません。 \fは書式送りで、これがあるところで改ページが起こる 事を期待していたのですが、何も起こりません。 \fはどのように使うのでしょうか。

  • 2147483647LのLについて

    処理系:Borland C++ Compiler 5.5 OS  :Windows XP C言語のint型の最大値を知りたくて、_lim.hの 中を覗きました。 #define INT_MAX LONG_MAX /* maximum signed int value */ とあり、上の方に #define LONG_MAX 2147483647L /* maximum signed long value */ とあるのですが、2147483647Lの Lはどういうときに使うのでしょうか。教えてください。

  • static付き宣言の初期化

    static付きの宣言をした場合の変数の初期化について教えてください。(ANSI-C) int func(void) { static int si; static char sca[10]; static char *scp; /* 何らかの処理 */ return 0; } このように関数内でstatic付きで宣言したとき、変数はどのように初期化されますか? siは0、sca[0]からsca[9]までは'\0'、scpはNULLで初期化されますか? また、このようなstatic付きの宣言が関数の外にあった場合は、どのように初期化されますか?

  • PHP 変数の初期化について教えてください

    PHPを勉強中の者です。他のプログラム言語の使用経験は一切ありません。 PHPにおいては変数の初期化は絶対に必要ではないということで、今まで特に気にすることは無かったのですが、マニュアルにもあるように初期化することは良い習慣とのことで正しい初期化を知りたく質問させていただきます。 他のプログラムにおいては最も最初に解決すべき部分であり、恥を晒すようですが、なにとぞアドバイスをいただけたらと思います。 以下質問になります。 ---------------------------------- 1.私の解釈では変数の初期化とは、変数の型を決め初期値を入れる、と認識していますが、これは正しいのでしょうか。 2.Javaの参考書で変数の部分を読んでみたところ、型を決めただけでは初期化とはいわず、型決めと初期値を入れた工程(工程ってのもおおげさかもしれませんが)が初期化と記載がありました。 PHPにおいては型の宣言は不要とのことで下記のように記載すれば型及び初期値が決まると解釈していますが、この解釈は正しいのでしょうか? $a = 1;  //これは整数 $d = 1.1 //これは浮動小数点 $b = "aa"; //これは文字列 $c = true; //これは論理値 $a = array(); //これは配列 3.他の参考になりそうなサイトで配列を代入する変数を初期化する場合として下記のような記載がありました。 unset($a); $a = array("aa", "bb"); unsetは変数を解放するためのものであり、私だったらこの場合の初期化として $a = array(); を書く方が適しているように思いますが、配列を代入する変数を初期化する場合、上記サンプルと私の考えとどちらが正しいのでしょうか? 4.変数を初期化するタイミングについて 質問のために、サンプルコードを書きました。まず下記サンプルを見てください。 ※このサンプルコードはformエリアからの入力値によって計算を行なうものと想定して下さい。値を受けた後の処理工程を記載しています。また、受ける値の正当性チェックについて省いています。 (1)(2)については質問箇所です。 (1) if(isset($_GET['send'], $_GET['int1'], $_GET['int2'])){ (2) $a = $_GET['int1']; $b = $_GET['int2'] }else{ exit; } $c = $a + $b; echo $c; サンプルコードは以上となります。仮にこういうコードがあったとして、初期化するタイミングがわかりません。コード中に(1)(2)と番号を振りましたが、個人的にこの2箇所のどちらかで初期化すればよいだろうと思い込んでいますが、こういうコードの場合、どの部分で初期化した方がいいのでしょうか? ---------------------------------- 質問は以上となります。 何卒宜しくおねがいします。

    • ベストアンサー
    • PHP
  • 構造体の静的な初期化

    構造体の静的な初期化で、初期化が書かれていないメンバーは、 どうなるのでしょうか。。? たとえば・・・ // 構造体の宣言 strcut MY_STRUCT {    int data1 ;    int data2 ;    int data3 ;    int data4 ; } ; // 変数宣言&初期化 static strcut MY_STRUCT st = {    .data1 = 100,    .data3 = 300 } ; ネットで調べると、 初期化で指示されていないメンバーは0に初期化される、 という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか? それともコンパイラ依存の仕様でしょうか?