• ベストアンサー

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

言語: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