2013-10-15 :-)
_ [連結リスト][デザインパターン][Commandパターン][C]連結リストで Command パターン
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> typedef void (*command_t)(int argc, ...); struct node_t { struct node_t* next; command_t cmd; } root; /* 先頭に追加 */ void put(command_t cmd) { struct node_t* _p; struct node_t* _q; for(_p = &root; _p->next != NULL; _p = _p->next) ; _q = (struct node_t*)malloc(sizeof(struct node_t)); if(_q == NULL) { perror("put"); exit(0); } _q->cmd = cmd; _q->next = _p->next; _p->next = _q; } /* 先頭を削除 */ void get(void) { struct node_t* _p; _p = root.next; if(_p == NULL) { printf("root is empty\n"); return; } root.next = _p->next; free(_p); } void command1(int argc, ...) { int i; va_list args; va_start(args, argc); printf("command1\n"); for(i = 0; i < argc; i++) { int n; n = va_arg(args, int); printf("%d\n", n); } va_end(args); } void command2(int argc, ...) { int c; int n; va_list args; printf("command2\n"); va_start(args, argc); c = va_arg(args, int); n = va_arg(args, int); printf("c:%d n:%d\n", c, n); va_end(args); } void run(void) { int n; struct node_t* _p; n = 0; for(_p = &root; _p->next != NULL; _p = _p->next) { if(_p->next != NULL) { _p->next->cmd(2, n, n * 10); n++; } } } void test_command(void) { printf("test_command start\n"); put(command1); put(command2); run(); printf("test_command end\n"); } int main(int ac, char** av) { test_command(); return 0; }
test_command start command1 0 0 command2 c:1 n:10 test_command end
_ [連結リスト][デザインパターン][Commandパターン][C][優先度]連結リストで優先度あり Command パターン
たんに連結リストの配列にしただけ。0 が優先度高くて、20 が優先度低いです。UNIX 系統の優先度と同じようなもんで。Command というかタスク管理というか。イメージとしては↓のような感じ。実行状態なんてないですが。
(via オリジナルOS「MicrOS」の設計と実装(4) ―― リアルタイム性の確保 )
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> #define PRI_MAX 20 typedef void (*command_t)(int argc, ...); struct node_t { struct node_t* next; command_t cmd; } root[PRI_MAX]; /* 先頭に追加 */ void put(int pri, command_t cmd) { int i; struct node_t* _p; struct node_t* _q; for(_p = &root[pri]; _p->next != NULL; _p = _p->next) ; _q = (struct node_t*)malloc(sizeof(struct node_t)); if(_q == NULL) { perror("put"); exit(0); } _q->cmd = cmd; _q->next = _p->next; _p->next = _q; } void command0(int argc, ...) { int pri; int n; va_list args; va_start(args, argc); pri = va_arg(args, int); n = va_arg(args, int); printf("command0 pri:%d n:%d\n", pri, n); va_end(args); } void run(void) { int pri; int n; struct node_t* _p; n = 0; for(pri = 0; pri < PRI_MAX; pri++) { for(_p = &root[pri]; _p->next != NULL; _p = _p->next) { if(_p->next != NULL) { _p->next->cmd(2, pri, n); n++; } } } } void test_command(void) { printf("test_command start\n"); put(19, command0); put(19, command0); put(0, command0); put(0, command0); put(1, command0); put(2, command0); run(); printf("test_command end\n"); } int main(int ac, char** av) { test_command(); return 0; }
test_command start command0 pri:0 n:0 command0 pri:0 n:1 command0 pri:1 n:2 command0 pri:2 n:3 command0 pri:19 n:4 command0 pri:19 n:5 test_command end