質問: N+1; ```
回答: >なるべくconst int といった定数で要素数を指定しています。 Cにおいてはこれは定数ではなくread onlyな変数にすぎないので、配列の要素数指定に使うのはVLAという別の機能になります。 VLAはstatic変数になれないので、自動変数領域に確保するときのみに利用できます(gccは独自拡張でVLAISとかいうクソ機能を持っているのでなんと構造体内にも宣言できる、うへぇ)。 つまりCにおいては 1. むしろ配列の大きさは直書きして、sizeofで要素数を取る設計にする 2. preprocessor macroないしenumで定数宣言して使う ことになります。C++のconstexprがほしいでござる。 なお厳密な型が欲しいならマクロで ``` #include #define PROJECTNAME_CONSTANT_HOGE_SIZE ((size_t)(32)) ``` みたいにするしかないでしょうね、C++と違ってenumの基底型指定できないし、constexprないし。 あるいはCではなくC++をつかう(つまりconstexprを使う)ことですかね。 追記見て ``` const static int N = 624; static unsigned long X[N]; static int I = N+1; ``` うん、予想通りだ。もう一度言うけど、VLAはstatic変数にできない。回避策は上述の通り。これが一つ目のエラー。 2つ目のエラーは、static変数の初期化子は定数じゃないといけないけど、変数Nは上述の通り、定数ではないのでエラー。 "Initializer element is not constant" error for no reason in Linux GCC, compiling C - Stack Overflow まあ ``` #ifdef _countof # define countof _countof #else # define countof(arr) (sizeof(arr)/sizeof(*arr)) #endif static unsigned long X[624]; static int I = countof(X)+1; ``` とかして使うのがいいんじゃないかな。こんな事程度にVLA使う意味がわからない。 それはそうと乱数生成にMT使いたいならそういうライブラリを使うべきかなと思います、MTの実装が課題じゃない限り。 あと、`N`とかいうなんの大きさなのかわからない可読性のかけらもない名前を識別名に使うのはやめましょう。今回の場合は上述マクロ使って`countof(X)`としておくべし。同様に`I`とかいう謎な名前もどうにかするべし(constついていないのは意図したもの?)。