性格悪い人が優勝

言語:c
OS:Windows XP
処理系:Borland C++ Compiler 5.5

静的変数の大量な要素を-1で初期化したいのですが、
どのようにかけばよいでしょうか。

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

A 回答 (8件)

#define X10(X) X,X,X,X,X,X,X,X,X,X



static int a[1000] = { X10(X10(X10(-1))) };

こんな感じでいかがでしょうか
    • good
    • 0
この回答へのお礼

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

マクロを上手く使うんですね。
こんなこともできるのだと感心しました。

お礼日時:2007/06/25 20:30

回答がいくつも集まっているなか「いまさら」で恐縮ですが、


質問の対象は「関数内で定義する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メンバ変数

この回答への補足

やりたかったのは上から2つ目の
関数の中のstatic変数です。

>void func(){
>  static int bbb=-1; /* これがstatic変数*/
>}

補足日時:2007/06/16 00:04
    • good
    • 0

-1,


を1000回書く(printfとかfprintf) するプログラムを書いて
それを
#include
はどうでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/25 20:42

> 処理系:Borland C++ Compiler 5.5



の場合、memsetはそんなに高速ではありません。
ここは、mainの最初の辺りで、

for (i = 0; i < 1000; i++) a[i] = -1;

とするのが、速度的にも、サイズ的にも、また移植性の面でも、最適だと思うのですがいかがでしょうか?

この回答への補足

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

補足日時:2007/06/25 20:42
    • good
    • 0

ご質問は、変数の初期化方法ではなく、初期値を持つ変数の定義方法に


ついてだと思います。

解答というより、改善案として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
    • good
    • 0
この回答へのお礼

アセンブラは私の扱える範囲を超えています・・

後ほど確認しようと思います。

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

お礼日時:2007/08/04 23:27

単純に


memset( a, -1, sizeof(a));
でいいと思います。

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

この回答への補足

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

補足日時:2007/08/04 23:25
    • good
    • 0

memset(a,0xff,sizeof(a));


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

この回答への補足

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

補足日時:2007/07/14 17:59
    • good
    • 0

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


そうです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/25 20:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!