回答編集履歴

3

整理忘れ

2024/06/03 05:15

投稿

jimbe
jimbe

スコア13066

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
- &(struct _cmd){ 0, 'a', "cmd_type_a_1" },
13
+ &(_CMD){ 0, 'a', "cmd_type_a_1" },
14
- &(struct _cmd){ 1, 'a', "cmd_type_a_2" },
14
+ &(_CMD){ 1, 'a', "cmd_type_a_2" },
15
- &(struct _cmd){ 2, 'a', "cmd_type_a_3" },
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
- &(struct _cmd){ 0, 'b', "cmd_type_b_1" },
20
+ &(_CMD){ 0, 'b', "cmd_type_b_1" },
21
- &(struct _cmd){ 1, 'b', "cmd_type_b_2" },
21
+ &(_CMD){ 1, 'b', "cmd_type_b_2" },
22
22
  NULL //EOD
23
23
  };
24
24
 
25
25
  typedef struct _cmd_c {
26
- struct _cmd cmd; //最初は必ず struct _cmd にすること
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)&(struct _cmd_c){{ 0, 'c', "cmd_type_c_1"}, 100 },
31
+ (CMD)&(_CMD_C){{ 0, 'c', "cmd_type_c_1"}, 100 },
32
- (CMD)&(struct _cmd_c){{ 1, 'c', "cmd_type_c_2"}, 200 },
32
+ (CMD)&(_CMD_C){{ 1, 'c', "cmd_type_c_2"}, 200 },
33
- (CMD)&(struct _cmd_c){{ 2, 'c', "cmd_type_c_3"}, 300 },
33
+ (CMD)&(_CMD_C){{ 2, 'c', "cmd_type_c_3"}, 300 },
34
- (CMD)&(struct _cmd_c){{ 3, 'c', "cmd_type_c_4"}, 400 },
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

コード整備、結果追加

2024/06/03 05:04

投稿

jimbe
jimbe

スコア13066

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
- printf("a: not found\n");
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
- printf("b: not found\n");
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
- printf("c: not found\n");
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 に追加データを入れてみた

2024/06/02 19:09

投稿

jimbe
jimbe

スコア13066

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
  }