回答編集履歴
1
出力する情報を増やせるように関数を可変長引数化、マクロは3パラメータまで対応。
answer
CHANGED
@@ -3,39 +3,57 @@
|
|
3
3
|
デバッグが終われば #define DEBUG をコメントアウトすることで直接配列アクセスになります。
|
4
4
|
|
5
5
|
```c
|
6
|
-
#include<stdio.h>
|
6
|
+
#include <stdio.h>
|
7
|
-
#include<stdlib.h>
|
7
|
+
#include <stdlib.h>
|
8
|
+
#include <stdarg.h>
|
8
9
|
|
9
10
|
#define DEBUG
|
10
11
|
|
11
12
|
#ifdef DEBUG
|
12
|
-
int *getArr(int *arr, int i, char *
|
13
|
+
int *getArr(int *arr, int i, char *fmt, ...) {
|
14
|
+
if(i < 0 || i >= 18900*200) {
|
15
|
+
char buf[1024];
|
16
|
+
va_list ap;
|
17
|
+
va_start(ap, fmt);
|
18
|
+
vsprintf(buf, fmt, ap);
|
19
|
+
va_end(ap);
|
13
|
-
|
20
|
+
printf("'%s' index error: i=%d\n",buf,i);
|
21
|
+
exit(1);
|
22
|
+
}
|
14
23
|
return &arr[i];
|
15
24
|
}
|
16
25
|
#define ARR(i,s) (*getArr(arr,i,s))
|
26
|
+
#define ARR1(i,s,v1) (*getArr(arr,i,s,v1))
|
27
|
+
#define ARR2(i,s,v1,v2) (*getArr(arr,i,s,v1,v2))
|
28
|
+
#define ARR3(i,s,v1,v2,v3) (*getArr(arr,i,s,v1,v2,v3))
|
17
29
|
#else
|
18
30
|
#define ARR(i,s) arr[i]
|
31
|
+
#define ARR1(i,s,v1) arr[i]
|
32
|
+
#define ARR2(i,s,v1,v2) arr[i]
|
33
|
+
#define ARR3(i,s,v1,v2,v3) arr[i]
|
19
34
|
#endif
|
20
35
|
|
21
36
|
int main(void) {
|
22
37
|
int *arr = (int*)malloc(sizeof(int) * 18900 * 200);
|
23
38
|
|
24
|
-
int
|
39
|
+
int BB = 18900;
|
25
|
-
|
40
|
+
int m = 200;
|
41
|
+
int AA = 0;
|
26
42
|
|
27
|
-
|
43
|
+
ARR3(BB*m+AA, "testA BB=%d,m=%d,AA=%d",BB,m,AA) = 123;
|
28
44
|
|
45
|
+
int i=BB*m+AA;
|
29
|
-
printf("arr[%d]=%d\n", i, ARR(i,"
|
46
|
+
printf("arr[%d]=%d\n", i, ARR(i,"testB"));
|
30
47
|
printf("end.\n");
|
31
48
|
}
|
49
|
+
|
32
50
|
```
|
33
|
-
配列内のインデックス(
|
51
|
+
配列内のインデックス(int AA=-1)とした場合
|
34
52
|
```plain
|
35
53
|
arr[3779999]=123
|
36
54
|
end.
|
37
55
|
```
|
38
|
-
配列外のインデックス(
|
56
|
+
配列外のインデックス(int AA=0)とした場合
|
39
57
|
```plain
|
40
|
-
'
|
58
|
+
'testA BB=18900,m=200,AA=0' index error: i=3780000
|
41
59
|
```
|