首页 > 其他分享 >Menu callback函数

Menu callback函数

时间:2023-04-03 10:37:19浏览次数:41  
标签:函数 callback Menu cmd pNode tDataNode tLinkTableNode

对于一般的函数来说,函数的编写和调用都是我们自己。但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运行的效果如下

 

 

  

标签:函数,callback,Menu,cmd,pNode,tDataNode,tLinkTableNode
From: https://www.cnblogs.com/ttttttx/p/17282206.html

相关文章

  • 【ChatGPT答】频率特性、频谱特性、幅频特性的区别,传递函数和增益的区别
    仅供参考。频率特性频率特性是指一个系统或信号在不同频率下的性质,通常用于描述系统或信号的频率响应。在信号处理中,频率特性是对信号在频率域中的分布和特征进行描述的一种方式,也是理解信号在不同频率下的行为的基础。具体来说,频率特性包括以下几个方面:频率响应:一个系统对......
  • 模拟实现字符串函数strcat和strcmp
    my_strcat函数实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<assert.h>#include<string.h>char*my_strcat(char*dest,constchar*src){ assert(dest&&src); char*ret=dest; //找目标串的'\0' while(*des......
  • Shell 函数
    Shell函数各种语言都有函数或者别的称呼,说白了就是封装一个可重复使用的代码快,起一个名称带一些参数,给一个返回值。linuxshell可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:[function]funname[()]{action;[returnint;]}......
  • 逆向——C语言的汇编表示之堆栈图 手把手示例 可以考虑在函数内部加一个局部变量来综
    课程概要来自:https://gh0st.cn/Binary-Learning/C%E8%AF%AD%E8%A8%80.html写得非常详细本章课程需要具备汇编语言基础,若无汇编语言基础是无法去理解课程中所讲的一些知识点和技术细节的;同时也表示本课程是以汇编语言来理解C语言,透过本质理解高级语言。关于本节课的环境:VC6,VC6......
  • 逆向——从一个实际例子看EBP+4为何是函数的返回地址
    第六节1、逆向CRACKME1、OD加载CRACKME后,为啥地址停在0x00401000?--需要知道什么是PE结构。  ——————2、出现这个框,表示程序已经执行完判断。3、弹出窗口是WIN32API的知识,它是API的MessageBoxA函数实现的功能。  ——————4、如何正确的下断点?(1)在OD......
  • 有关哈希表简单的散列函数实现-Java实现
    其实现不难,所以直接贴代码:1packagedataSrtuct;23importjava.util.ArrayList;4importjava.util.LinkedList;56publicclassHashTab{7publicstaticvoidmain(String[]args){8hashTablehashT=newhashTable(10);9......
  • path()方法函数定义
    path()方法函数定义path函数在Django中的的定义如下所示:path(route,view,kwargs,name)它可以接收4个参数,其中前两个是必填参数后两个为可选参数。参数解析如下:1.routeroute是一个匹配URL的准则(类似正则表达式)。当Django响应一个请求时,它会从urlpatterns的第......
  • 5.函数6.数组7.操作符8.常见关键字9.#define定义的常量和宏
    在我们学习的数学里面,函数的概念例子比如f(x)=2*x+1;  f(x,y)=x+y;在c语言也是同样的样子比如,我举例一条要相加的例子#definr_#include<stdio.h>intAdd(intx,inty)//int是他的返回类型是个整形,所以要加int//这就是一个函数add是自己创建的一个函数名,括号里面叫做函数的......
  • NIM游戏/SG函数
    NIM游戏先看一下一维NIM游戏。有一堆大小为\(n\)的石子,甲和乙轮流从石堆里面拿石子,不能一次拿掉所有石子,取走最后一个石子的人获胜,甲先开始,谁是必胜的?显然,谁先手,谁就获胜。那么推广到二维呢?有两堆大小为\(n\)\(m\)的石子,甲和乙轮流从两个石堆里拿石子,每次从一个石堆......
  • matlab神经网络训练函数和性能函数
    Theresponseisderivedfromwebsearchresults.Hereisatablethatsummarizessomeoftheadvantages,disadvantagesandapplicationsofdifferenttrainingfunctionsandperformancefunctionsforneuralnetworks.训练函数性能函数优点缺点应用场合......