回答編集履歴

5

SHOULD NOT USE VLA

2017/06/10 10:42

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
 
104
104
 
105
- とかして使うのがいいんじゃないかな。
105
+ とかして使うのがいいんじゃないかな。こんな事程度にVLA使う意味がわからない。
106
106
 
107
107
 
108
108
 

4

refactor

2017/06/10 10:42

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -107,3 +107,7 @@
107
107
 
108
108
 
109
109
  それはそうと乱数生成にMT使いたいならそういうライブラリを使うべきかなと思います、MTの実装が課題じゃない限り。
110
+
111
+
112
+
113
+ あと、`N`とかいうなんの大きさなのかわからない可読性のかけらもない名前を識別名に使うのはやめましょう。今回の場合は上述マクロ使って`countof(X)`としておくべし。同様に`I`とかいう謎な名前もどうにかするべし(constついていないのは意図したもの?)。

3

追記を受けて。

2017/06/10 10:37

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -41,3 +41,69 @@
41
41
 
42
42
 
43
43
  あるいはCではなくC++をつかう(つまりconstexprを使う)ことですかね。
44
+
45
+
46
+
47
+ ---
48
+
49
+
50
+
51
+ 追記見て
52
+
53
+
54
+
55
+ ```c
56
+
57
+ const static int N = 624;
58
+
59
+
60
+
61
+ static unsigned long X[N];
62
+
63
+ static int I = N+1;
64
+
65
+ ```
66
+
67
+
68
+
69
+ うん、予想通りだ。もう一度言うけど、VLAはstatic変数にできない。回避策は上述の通り。これが一つ目のエラー。
70
+
71
+
72
+
73
+ 2つ目のエラーは、static変数の初期化子は定数じゃないといけないけど、変数Nは上述の通り、定数ではないのでエラー。
74
+
75
+ ["Initializer element is not constant" error for no reason in Linux GCC, compiling C - Stack Overflow](https://stackoverflow.com/questions/21592494/initializer-element-is-not-constant-error-for-no-reason-in-linux-gcc-compilin)
76
+
77
+
78
+
79
+ まあ
80
+
81
+
82
+
83
+ ```c
84
+
85
+ #ifdef _countof
86
+
87
+ # define countof _countof
88
+
89
+ #else
90
+
91
+ # define countof(arr) (sizeof(arr)/sizeof(*arr))
92
+
93
+ #endif
94
+
95
+
96
+
97
+ static unsigned long X[624];
98
+
99
+ static int I = countof(X)+1;
100
+
101
+ ```
102
+
103
+
104
+
105
+ とかして使うのがいいんじゃないかな。
106
+
107
+
108
+
109
+ それはそうと乱数生成にMT使いたいならそういうライブラリを使うべきかなと思います、MTの実装が課題じゃない限り。

2

VLAIS

2017/06/10 10:34

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Cにおいてはこれは定数ではなくread onlyな変数にすぎないので、配列の要素数指定に使うのはVLAという別の機能になります。
6
6
 
7
- VLAはstatic変数になれないので、自動変数領域に確保するときのみに利用できます。
7
+ VLAはstatic変数になれないので、自動変数領域に確保するときのみに利用できます(gccは独自拡張で[VLAIS](https://cpplover.blogspot.jp/2013/04/llvmclanglinuxgcc.html)とかいうクソ機能を持っているのでなんと構造体内にも宣言できる、うへぇ)
8
8
 
9
9
 
10
10
 

1

型について

2017/06/10 09:17

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -19,3 +19,25 @@
19
19
 
20
20
 
21
21
  ことになります。C++のconstexprがほしいでござる。
22
+
23
+
24
+
25
+ なお厳密な型が欲しいならマクロで
26
+
27
+
28
+
29
+ ```c
30
+
31
+ #include <stddef.h>
32
+
33
+ #define PROJECTNAME_CONSTANT_HOGE_SIZE ((size_t)(32))
34
+
35
+ ```
36
+
37
+
38
+
39
+ みたいにするしかないでしょうね、C++と違ってenumの基底型指定できないし、constexprないし。
40
+
41
+
42
+
43
+ あるいはCではなくC++をつかう(つまりconstexprを使う)ことですかね。