teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

出力する情報を増やせるように関数を可変長引数化、マクロは3パラメータまで対応。

2021/08/27 10:50

投稿

jimbe
jimbe

スコア13352

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 *s) {
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
- if(i < 0 || i >= 18900*200) { printf("'%s' index error: i=%d\n",s,i); exit(1); }
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 i=18900*200-1; //範囲内
39
+ int BB = 18900;
25
- //int i=18900*200; //範囲外
40
+ int m = 200;
41
+ int AA = 0;
26
42
 
27
- ARR(i, "test A") = 123;
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,"test B"));
46
+ printf("arr[%d]=%d\n", i, ARR(i,"testB"));
30
47
  printf("end.\n");
31
48
  }
49
+
32
50
  ```
33
- 配列内のインデックス(i=18900*200-1)とした場合
51
+ 配列内のインデックス(int AA=-1)とした場合
34
52
  ```plain
35
53
  arr[3779999]=123
36
54
  end.
37
55
  ```
38
- 配列外のインデックス(i=18900*200) とした場合
56
+ 配列外のインデックス(int AA=0)とした場合
39
57
  ```plain
40
- 'test A' index error: i=3780000
58
+ 'testA BB=18900,m=200,AA=0' index error: i=3780000
41
59
  ```