回答編集履歴
3
整理忘れ
test
CHANGED
@@ -7,31 +7,31 @@
|
|
7
7
|
typedef struct _cmd {
|
8
8
|
int no, type;
|
9
9
|
char *name;
|
10
|
-
} *CMD;
|
10
|
+
} *CMD, _CMD;
|
11
11
|
|
12
12
|
static CMD CMD_TYPE_A_TABLE[] = {
|
13
|
-
&(
|
13
|
+
&(_CMD){ 0, 'a', "cmd_type_a_1" },
|
14
|
-
&(
|
14
|
+
&(_CMD){ 1, 'a', "cmd_type_a_2" },
|
15
|
-
&(
|
15
|
+
&(_CMD){ 2, 'a', "cmd_type_a_3" },
|
16
16
|
NULL //EOD
|
17
17
|
};
|
18
18
|
|
19
19
|
static CMD CMD_TYPE_B_TABLE[] = {
|
20
|
-
&(
|
20
|
+
&(_CMD){ 0, 'b', "cmd_type_b_1" },
|
21
|
-
&(
|
21
|
+
&(_CMD){ 1, 'b', "cmd_type_b_2" },
|
22
22
|
NULL //EOD
|
23
23
|
};
|
24
24
|
|
25
25
|
typedef struct _cmd_c {
|
26
|
-
|
26
|
+
_CMD cmd; //最初は必ず _cmd 構造体にすること
|
27
27
|
int type_c_addnl_value;
|
28
|
-
} *CMD_C;
|
28
|
+
} *CMD_C, _CMD_C;
|
29
29
|
|
30
30
|
static CMD CMD_TYPE_C_TABLE[] = {
|
31
|
-
(CMD)&(
|
31
|
+
(CMD)&(_CMD_C){{ 0, 'c', "cmd_type_c_1"}, 100 },
|
32
|
-
(CMD)&(
|
32
|
+
(CMD)&(_CMD_C){{ 1, 'c', "cmd_type_c_2"}, 200 },
|
33
|
-
(CMD)&(
|
33
|
+
(CMD)&(_CMD_C){{ 2, 'c', "cmd_type_c_3"}, 300 },
|
34
|
-
(CMD)&(
|
34
|
+
(CMD)&(_CMD_C){{ 3, 'c', "cmd_type_c_4"}, 400 },
|
35
35
|
NULL //EOD
|
36
36
|
};
|
37
37
|
|
@@ -55,7 +55,7 @@
|
|
55
55
|
printf("no=%d, type=%c name=%s", cmd->no, cmd->type, cmd->name);
|
56
56
|
if(cmd->type == 'c') {
|
57
57
|
CMD_C cmd_c = (CMD_C)cmd;
|
58
|
-
printf(" add_value=%d", cmd_c->type_c_addnl_value);
|
58
|
+
printf(" addnl_value=%d", cmd_c->type_c_addnl_value);
|
59
59
|
}
|
60
60
|
} else {
|
61
61
|
printf("not found");
|
2
コード整備、結果追加
test
CHANGED
@@ -23,8 +23,8 @@
|
|
23
23
|
};
|
24
24
|
|
25
25
|
typedef struct _cmd_c {
|
26
|
-
struct _cmd cmd;
|
26
|
+
struct _cmd cmd; //最初は必ず struct _cmd にすること
|
27
|
-
int type_c_add_value;
|
27
|
+
int type_c_addnl_value;
|
28
28
|
} *CMD_C;
|
29
29
|
|
30
30
|
static CMD CMD_TYPE_C_TABLE[] = {
|
@@ -35,33 +35,48 @@
|
|
35
35
|
NULL //EOD
|
36
36
|
};
|
37
37
|
|
38
|
-
CMD get_cmd(char *name, CMD *table) {
|
38
|
+
CMD get_cmd_from_name(char *name, CMD *table) {
|
39
39
|
for(CMD *p=table, cmd; (cmd=*p); p++) {
|
40
40
|
if(strcmp(name,cmd->name) == 0) return cmd;
|
41
41
|
}
|
42
42
|
return NULL;
|
43
43
|
}
|
44
44
|
|
45
|
+
CMD get_cmd_from_no(int no, CMD *table) {
|
46
|
+
for(CMD *p=table, cmd; (cmd=*p); p++) {
|
47
|
+
if(no == cmd->no) return cmd;
|
48
|
+
}
|
49
|
+
return NULL;
|
50
|
+
}
|
51
|
+
|
52
|
+
void print_cmd(char *prompt, CMD cmd) {
|
53
|
+
printf("%s: ", prompt);
|
54
|
+
if(cmd != NULL) {
|
55
|
+
printf("no=%d, type=%c name=%s", cmd->no, cmd->type, cmd->name);
|
56
|
+
if(cmd->type == 'c') {
|
57
|
+
CMD_C cmd_c = (CMD_C)cmd;
|
58
|
+
printf(" add_value=%d", cmd_c->type_c_addnl_value);
|
59
|
+
}
|
60
|
+
} else {
|
61
|
+
printf("not found");
|
62
|
+
}
|
63
|
+
printf("\n");
|
64
|
+
}
|
65
|
+
|
45
66
|
int main(void) {
|
46
|
-
CMD a = get_cmd("cmd_type_a_2", CMD_TYPE_A_TABLE);
|
67
|
+
CMD a = get_cmd_from_name("cmd_type_a_2", CMD_TYPE_A_TABLE);
|
47
|
-
if(a != NULL) {
|
48
|
-
printf("a.no=%d, a.type=%c a.name=%s\n", a->no, a->type, a->name);
|
49
|
-
} else {
|
50
|
-
|
68
|
+
print_cmd("a", a);
|
51
|
-
}
|
52
69
|
|
53
|
-
CMD b = get_cmd("cmd_type_b_3", CMD_TYPE_B_TABLE);
|
70
|
+
CMD b = get_cmd_from_name("cmd_type_b_3", CMD_TYPE_B_TABLE);
|
54
|
-
if(b != NULL) {
|
55
|
-
printf("b.no=%d, b.type=%c b.name=%s\n", b->no, b->type, b->name);
|
56
|
-
} else {
|
57
|
-
|
71
|
+
print_cmd("b", b);
|
58
|
-
}
|
59
72
|
|
60
|
-
CMD c = get_cmd("cmd_type_c_4", CMD_TYPE_C_TABLE);
|
73
|
+
CMD c = get_cmd_from_name("cmd_type_c_4", CMD_TYPE_C_TABLE);
|
61
|
-
if(c != NULL) {
|
62
|
-
printf("c.no=%d, c.type=%c c.name=%s c.add_value=%d\n", c->no, c->type, c->name, ((CMD_C)c)->type_c_add_value);
|
63
|
-
} else {
|
64
|
-
|
74
|
+
print_cmd("c", c);
|
65
|
-
}
|
66
75
|
}
|
67
76
|
```
|
77
|
+
paiza.ioで実行
|
78
|
+
```
|
79
|
+
a: no=1, type=a name=cmd_type_a_2
|
80
|
+
b: not found
|
81
|
+
c: no=3, type=c name=cmd_type_c_4 addnl_value=400
|
82
|
+
```
|
1
type_c に追加データを入れてみた
test
CHANGED
@@ -22,16 +22,21 @@
|
|
22
22
|
NULL //EOD
|
23
23
|
};
|
24
24
|
|
25
|
+
typedef struct _cmd_c {
|
26
|
+
struct _cmd cmd;
|
27
|
+
int type_c_add_value;
|
28
|
+
} *CMD_C;
|
29
|
+
|
25
30
|
static CMD CMD_TYPE_C_TABLE[] = {
|
26
|
-
&(struct _cmd){ 0, 'c', "cmd_type_c_1" },
|
31
|
+
(CMD)&(struct _cmd_c){{ 0, 'c', "cmd_type_c_1"}, 100 },
|
27
|
-
&(struct _cmd){ 1, 'c', "cmd_type_c_2" },
|
32
|
+
(CMD)&(struct _cmd_c){{ 1, 'c', "cmd_type_c_2"}, 200 },
|
28
|
-
&(struct _cmd){ 2, 'c', "cmd_type_c_3" },
|
33
|
+
(CMD)&(struct _cmd_c){{ 2, 'c', "cmd_type_c_3"}, 300 },
|
29
|
-
&(struct _cmd){ 3, 'c', "cmd_type_c_4" },
|
34
|
+
(CMD)&(struct _cmd_c){{ 3, 'c', "cmd_type_c_4"}, 400 },
|
30
35
|
NULL //EOD
|
31
36
|
};
|
32
37
|
|
33
38
|
CMD get_cmd(char *name, CMD *table) {
|
34
|
-
for(CMD *p=table, cmd; cmd=*p; p++) {
|
39
|
+
for(CMD *p=table, cmd; (cmd=*p); p++) {
|
35
40
|
if(strcmp(name,cmd->name) == 0) return cmd;
|
36
41
|
}
|
37
42
|
return NULL;
|
@@ -54,7 +59,7 @@
|
|
54
59
|
|
55
60
|
CMD c = get_cmd("cmd_type_c_4", CMD_TYPE_C_TABLE);
|
56
61
|
if(c != NULL) {
|
57
|
-
printf("c.no=%d, c.type=%c c.name=%s\n", c->no, c->type, c->name);
|
62
|
+
printf("c.no=%d, c.type=%c c.name=%s c.add_value=%d\n", c->no, c->type, c->name, ((CMD_C)c)->type_c_add_value);
|
58
63
|
} else {
|
59
64
|
printf("c: not found\n");
|
60
65
|
}
|