링크 로 if 구문 이 너무 많은 문 제 를 해결 합 니 다(C/C+구현)
17915 단어 c/c++
http://www.cnblogs.com/code-style/p/3499408.html
디자인 모드 솔 루 션(python 언어 기반)
http://www.cnblogs.com/code-style/p/3501713.html
http://www.cnblogs.com/code-style/p/3502105.html
디자인 모델 로 이 루어 진 후에 나 는 이른바 디자인 모델 이 사실은 C 언어 에서 링크 가 아니 냐 는 것 을 알 게 되 었 다.현재 노드 를 처리 할 수 있 으 면 처리 할 수 없고 다음 노드 를 처리 할 수 없습니다.
메시지 디자인
message.h
#ifndef MESSAGE_H
#define MESSAGE_H
#define TRUE 1
#define FALSE 0
typedef struct {
int sender;
int isSend;
int isCharge;
char date[8];
}Message;
Message * makeMessage(const int sender, const char *date);
void setSendFlag(Message * const message);
void setChargeFlag(Message * const message);
int isSameDate(const Message * const message, const char * const date);
char * format(const Message * const message);
const char * boolStr(const int value);
#endif message.c
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "message.h"
Message * makeMessage(const int sender, const char *date)
{
Message *message = (Message*)malloc(sizeof(Message));
assert(message != NULL);
message->sender = sender;
message->isSend = FALSE;
message->isCharge = FALSE;
strncpy(message->date, date, 8);
return message;
}
const char * boolStr(const int value)
{
return value == TRUE ? "TRUE" : "FALSE";
}
char * format(const Message * const message)
{
#define BUF_SIZE 1024
static char buffer[BUF_SIZE];
memset(&buffer, 0, BUF_SIZE);
snprintf((char*)&buffer, BUF_SIZE, "Message <%d isSend:%s isCharge:%s>
", \
message->sender, boolStr(message->isSend), boolStr(message->isCharge));
return (char*)buffer;
}
void setSendFlag(Message * const message)
{
message->isSend = TRUE;
}
void setChargeFlag(Message * const message)
{
message->isCharge = TRUE;
}
int isSameDate(const Message * const message, const char * const date)
{
if (strncmp(message->date, date, 8) == 0)
{
return TRUE;
}
else
{
return FALSE;
}
} testMessage.c
#include <stdio.h>
#include "message.h"
#include "gtest/gtest.h"
TEST(MESSAGE,makeMessage){
Message *message = makeMessage(1,"20131212");
EXPECT_EQ(1, message->sender);
EXPECT_STREQ("Message <1 isSend:FALSE isCharge:FALSE>
", format(message));
} 링크 클래스 의 실현
node.h
#ifndef NOTE_H
#define NOTE_H
typedef struct Node{
void *ptr;
struct Node *next;
}Node;
Node *makeListWithArray(void *array[], int length);
void foreach(Node *list, void (*process) (Node *));
#endif node.c
#include <stdlib.h>
#include <assert.h>
#include "node.h"
Node *makeListWithArray(void *array[], int length)
{
int i;
Node *last = NULL;
assert(array != NULL && length > 0);
for(i = length - 1; i >= 0; i--)
{
Node *node = (Node*)malloc(sizeof(Node));
node->ptr = array[i];
node->next = last;
last = node;
}
return last;
}
void foreach(Node *list, void (*process) (Node *))
{
Node *current = NULL;
assert(list != NULL && process != NULL);
for(current = list; current != NULL; current = current->next)
{
process(current);
}
} testNode.c
#include <stdio.h>
#include "node.h"
#include "gtest/gtest.h"
void printNode(Node *node)
{
static int i = 0;
int data[] = {1,2,3};
EXPECT_EQ(data[i], *(int*)node->ptr);
i++;
}
TEST(NODE,makeListWithArray){
int i;
int data[] = {1,2,3};
void *aSet[] = {&data[0], &data[1], &data[2]};
Node *list = makeListWithArray(aSet, 3);
foreach(list, printNode);
} 프로그램 입구 구현(main.c)
#include <stdio.h>
#include <string.h>
#include "message.h"
#include "node.h"
# define FALSE 0
# define TRUE 1
typedef int BOOL;
typedef BOOL (*FuncIsAllowSend)(Message *, Node*);
BOOL isAllowSendCheckDate(Message *message, Node *node)
{
FuncIsAllowSend isAllowSend = NULL;
if(strcmp(message->date, "20130101") == 0)
{
return FALSE;
}
isAllowSend = (FuncIsAllowSend) node->next->ptr;
return isAllowSend(message, node->next);
}
BOOL isAllowSendCheckWhiteList(Message *message, Node *node)
{
FuncIsAllowSend isAllowSend = NULL;
if(message->sender == 10)
{
return TRUE;
}
isAllowSend = (FuncIsAllowSend) node->next->ptr;
return isAllowSend(message, node->next);
}
BOOL isAllowSendWithDefault(Message *message, Node *node)
{
setChargeFlag(message);
return TRUE;
}
int main()
{
Message *message = makeMessage(1,"20131212");
void *actionList[] = {(void*)&isAllowSendCheckDate,
(void*)&isAllowSendCheckWhiteList,
(void*)&isAllowSendWithDefault};
Node *theList = makeListWithArray(actionList, sizeof(actionList)/4);
FuncIsAllowSend isAllowSend = (FuncIsAllowSend)theList->ptr;
if(isAllowSend(message, theList) == TRUE)
{
setSendFlag(message);
}
printf("%s
",format(message));
} 코드 스타일 은 사실 C 스타일 이지 만 gtest 를 사용 하려 면 g++를 사용 하여 프로그램 을 컴 파일 디 버 깅 해 야 합 니 다.명령 은 다음 과 같 습 니 다.
# : gtest
g++ -c message.c
g++ -c testMessage.c
g++ message.o testMessage.o -lgtest -lpthread
./a.out
g++ -c node.c
g++ -c testNode.c
g++ node.o testNode.o -lgtest -lpthread
./a.out
g++ -c main.c
g++ message.o node.o main.o
./a.out