Menu callback函数

发布时间 2023-04-03 10:27:44作者: HHUCTX

对于一般的函数来说,函数的编写和调用都是我们自己。但callback函数不是这样的,它是由我们编写但是不由我们调用,由我们将函数指针传给其他模块,再由其他模块通过我们传递的函数指针来调用我们编写的函数。

 

在menu5.2中,向其他模块传递callback函数的 函数如下,传递的callback函数就是Condition参数,args声明为void* 是为了更好的通用性。

tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args)
{
    if(pLinkTable == NULL || Conditon == NULL)
    {
        return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != NULL)
    {    
        if(Conditon(pNode,args) == SUCCESS)
        {
            return pNode;                    
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

这里由 main函数的FindCmd调用 SearchLinkTableNode函数,传递callback函数SearchCondition

int main()
{
    InitMenuData(&head); 
   /* cmd line begins */
    while(1)
    {
        char cmd[CMD_MAX_LEN];
        printf("Input a cmd number > ");
        scanf("%s", cmd);
        tDataNode *p = FindCmd(head, cmd);  //callback位置
        //省略下面
}

tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
    return  (tDataNode*)SearchLinkTableNode(head,SearchCondition,(void*)cmd);
}    

Menu中还有一个设计,就是DataNode结构体,定义如下

typedef struct DataNode
{
    tLinkTableNode * pNext;
    char*   cmd;
    char*   desc;
    int     (*handler)();
} tDataNode;

tLinkTableNode的结构体如下所示

typedef struct LinkTableNode
{
    struct LinkTableNode * pNext;
}tLinkTableNode;

可以看到,将tLinkTableNode*强转成 tDataNode*,由于两个结构体的第一个成员变量是相同的,占相同大小的空间,因此实现了良好的复用。

 

 

 

  整个menu.c运行的效果如下