量化交易系统开发代码部署方案丨合约量化系统开发技术成熟源码流程

简介: 量化交易系统开发代码部署方案丨合约量化系统开发技术成熟源码流程

回调函数其实就是在一个函数里面调用了另一个函数,而调用哪个函数是由调用回调函数的人决定,举个简单例子:

int add(int a,int b)
{

return a+b;

}
int sub(int a,int b)
{

return a-b;

}
typedef int (*pfunc)(int a,int b);
int func_callback(pfunc p,int a,int b)
{

return(*p)(a,b);

}
void main(void)
{

func_callback(add,1,2);//return 3
func_callback(sub,2,1);//return 1

}
复制
这里的func_callback就是回调函数,它的执行结果根据传进来的函数指针p的实际指向函数不同而不同,即传入加法add得到的是加法计算,传入减法sub得到的是减法计算结果。

回调函数的使用使得上层调用时仅需要同一个接口(func_callback)即可,而根据传入的参数不同而调用到不同的底层结果。

例如add和sub是操作系统或BSP提供的一个功能。我们希望上层应用在调用时具有拓展性,即如果底层新增了新的功能例如乘除法(mul,div),我们无需修改上层应用的接口,仅需在传入参数时增加新的参数(mul,div)即可。这样底层提供的API具有了通用性,应用层无需修改调用api的接口即可增加新的使用方式。

回调函数还有一个很好用的功能是和表驱动法结合:

表驱动法
表驱动法顾名思义就是类似数据库查表的方式实现功能,简单地说,将程序中的分支判断变为查表操作,简单例子:

char getCharfromHex(unsigned char ucNum)
{

char ucNumChar = 0;
if(ucNum < 10)
{
    ucNumChar = ucNum + '0';
}
else if(ucNum == 10)
{
    ucNumChar = 'A';
}
else if(ucNum == 11)
{
    ucNumChar = 'B';
}
else if(ucNum == 12)
{
    ucNumChar = 'C';
}
else if(ucNum == 13)
{
    ucNumChar = 'D';
}
else if(ucNum == 14)
{
    ucNumChar = 'E';
}
else if(ucNum == 15)
{
    ucNumChar = 'F';
}
else
{
    return 0;    
}
return ucNumChar;

}
复制
上面的操作是将一个16进制数变为ASCII表示的字符,如果使用表驱动,则可以实现为:

CHAR aNumChars[] = {'0', '1', '2', /3~9/'A', 'B', 'C', 'D', 'E', 'F'};
CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)];
复制
这样一个较多的if else或者switch case语句变为简单的查表操作。

使用表驱动法,则可以将很多功能接口进行排列后按查表方式进行执行,当功能接口较多时能够比switch语句更加简洁。

由表驱动和回调函数组成的通用功能接口
首先将对外的功能进行一个排列,构造一个功能接口表,并对功能接口编码(dispatch.h):

typedef enum {

ChipCheck = 0x41,
DataTrans = 0x01,
/*others*/
DataSave = 0x77,

} FunctionCode_t;
复制
根据功能函数的格式,声明一个函数指针(dispatch.h):

typedef u32 (pFunc)(u8 cmd_in, u8 *cmd_out);
复制
实现功能函数,注意功能函数的接口尽量保持一致,可以通过传入一个通用的结构体或指针数组方式,具体功能处理上的区别接口内部对数据进行细分处理。

头文件(dispatch.h):

u32 func_ChipCheck(u8 cmd_in, u8 cmd_out);
u32 func_DataTrans(u8 cmd_in, u8 cmd_out);
u32 func_DataSave(u8 cmd_in, u8 cmd_out);

相关文章
uni-app 4.13开发弹出层组件(二)弹出关闭功能
uni-app 4.13开发弹出层组件(二)弹出关闭功能
329 0
|
监控 Python
视频监控笔记(五):Jetson Nano上通过Tkinter和Socket实现GUI文件传输
这篇文章介绍了如何使用Python的Tkinter和Socket在Jetson Nano上实现图形用户界面(GUI)的文件传输系统,包括服务器端和客户端,能够进行文件的发送和接收,并展示传输进度。
205 1
|
7月前
|
jenkins 测试技术 Shell
利用Apipost轻松实现用户充值系统的API自动化测试
API在现代软件开发中扮演着连接不同系统与模块的关键角色,其测试的重要性日益凸显。传统API测试面临效率低、覆盖率不足及难以融入自动化工作流等问题。Apipost提供了一站式API自动化测试解决方案,支持零代码拖拽编排、全场景覆盖,并可无缝集成CI/CD流程。通过可视化界面,研发与测试人员可基于同一数据源协作,大幅提升效率。同时,Apipost支持动态数据提取、性能压测等功能,满足复杂测试需求。文档还以用户充值系统为例,详细介绍了从创建测试用例到生成报告的全流程,帮助用户快速上手并提升测试质量。
|
数据采集 存储 数据挖掘
CDGA|解锁数据价值:基础数据治理的至关重要性
在数据驱动时代,数据成为企业的宝贵资产。本文探讨了数据治理的重要性,介绍其为核心管理活动,确保数据的可用性、完整性、安全性和合规性。良好的数据治理能提升数据质量、加强安全、促进共享,并支持高效决策,从而帮助企业最大化数据价值。通过明确目标、建立组织、制定政策和强化技术支持,企业可以构建起科学的数据治理体系,推动未来发展。
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
12月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
1697 58
|
12月前
|
IDE 编译器 开发工具
C/C++开发环境
C/C++开发环境
297 4
|
安全 网络安全 网络虚拟化
优化大型企业网络架构:从核心到边缘的全面升级
大型企业在业务运作中涉及多种数据传输,涵盖办公应用、CRM/ERP系统、数据中心、云环境、物联网及安全合规等多个方面。其复杂的业务生态和全球布局要求网络架构具备高效、安全和可靠的特性。网络设计需全面考虑核心层、汇聚层和接入层的功能与冗余,同时实现内外部的有效连接,包括广域网连接、远程访问策略、云计算集成及多层次安全防护,以构建高效且可扩展的网络生态系统。
优化大型企业网络架构:从核心到边缘的全面升级
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
516 0
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)