当前位置: 首页 > news >正文

关于程序=数据结构+算法这句话最近的一些思考

最近看了很多单片机STM32的的相关程序,尤其是设计到ringbuff、buffer_manage、os_memory预计mem_manage等程序中间层的用法,我对这句话有了一些更深的思考,现在记录下来,希望对处于相同阶段的程序一些思想启迪。

首先“数据结构”也就是对一个事物用结构体类型、枚举类型、共用体类型、数组等进行封装描述,其中结构体类型是最常用的,例如STM32单片机中寄存器组就用一个结构体类型进行了封装。我在这里想说的是定义相关类型,内部成员有好多个。定义好数据结构后,下一步就是要定义一个相关的真实的数据,绝大多数情况就是全局变量,也有使用malloc、free申请释放的堆内存。最后就是操纵这个数据内部成员变量的相关函数,这就是算法,API函数,也叫接口函数。后面统称为算法。

再讲一下算法,上面我提到算法就是对结构体变量内部成员进行写读操作。这里就涉及到如何访问全局结构体变量内部的成员问题,答案是“使用结构体指针变量作为函数传参”的方式进行。我们定义接口函数的时候使用结构体指针变量来指向某个结构体变量。因为传参的过程是压栈(涉及到算法“=”)的过程,早期编译器不支持直接调用结构体本身,现在的编译器开始支持了,不过为了兼容早期程序,还是不建议直接将结构体直接赋值给函数参数,另外如果直接赋值,传递的是结构体成员内存格子中存储的数值,也无法在函数内部对函数外面的结构体内部成员进行修改(又名输出型参数)。我们在函数内部主要做的工作有:读取外部结构体的数据,如果需要暂存,那就要定义临时变量,也就是栈内存进行存储。我现在的感受就是写函数内部程序的时候如果需要获取结构体的成员,并且暂存的话,就要定义某个临时栈内存进行写操作,这样就相当于“数据的产生”(定义了某个变量并且写入了有效数据),光写进去还不行,我们还需要在后面的运算中去将临时栈内存中的变量读出来参数某些运算。这样又产生新的变量,于是又定义新变量,又进行写操作,又进行读操作... ... ...然后一直进行下去,直到函数运行结束。当然这个过程不可避免的会读结构体内部成员,以及通过指针变量的方式进行写有效数值。宏观上看函数运行的过程就表现为结构体内部成员变量的数值不断地被读,然后被写。最后函数运行可能会有return返回值,这个返回值大部分情况代表函数体内部运行的过程,经常看到提前return返回了,这就是“卫语句的写法”。从宏观上看就是一句话:返回值代表函数运行的过程,参数列表存储着运算的结果。

总结一下:定义相关类型,然后相关类型变量,最后定义API函数不断访问(写/读,生产/消费)变量本身或者变量内部成员,最后将这些封装写成一对头文件.h和源文件.c。这样就是程序的写法。现在想想这样写的好处就是:调用API函数对变量进行写有效数值,然后其他源文件可以直接访问全局变量的内部成员,也可以访问对应API函数进行读操作。两种方式都可以,在实际应用中都会大量应用。其中直接访问变量本身或者内部成员更方便。我们根据里面存储的数据然后加上各种逻辑判断、利用3大程序结构,就可以知道程序现在代表的状态,以及接下来要做什么。

整个过程,千万别在使用全局变量上吝啬使用,该用的时候还要用,没有全局变量,哪来的算法。我们大部分人不是高手,所以在程序编写过程中甚至产生了一些多余的全局变量也是不可避免的,重点是要实现要完成的功能。我再很长时间内都在摸索如何少用全局变量,现在想想真实有点贪心不足蛇吞象了,这个一定要切记。而且,现在51单片机、STM32单片机以及更高级的能跑linux内核的芯片内部有足够多的内存空间,所以平时写代码,真不用节省着来。可能随着编写能力的提升,可能会考虑节约使用全局变量以及隔离、分层思想,不能跨层访问等等,但是现阶段我暂时不会再考虑这样做了。

http://www.lryc.cn/news/590195.html

相关文章:

  • 数字ic后端设计从入门到精通11(含fusion compiler, tcl教学)全定制设计入门
  • Java-数构链表
  • golang语法-----指针
  • 笔试——Day10
  • 简单易懂,什么是连续分配管理方式
  • Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)
  • Java线程创建与运行全解析
  • DuckDB 高效导入 IPv6 地址数据的实践与性能对比
  • #Datawhale组队学习#7月-强化学习Task1
  • java解析word文档
  • 使用JS编写一个购物车界面
  • C++ 面向对象
  • 第2章通用的高并发架构设计——2.3 高并发读场景方案2:本地缓存
  • 开源 python 应用 开发(七)数据可视化
  • Linux 定时器应用示例(修正版)
  • GIT版本回退
  • Python中可以反转的数据类型
  • GaussDB 数据库架构师修炼(五) 存储容量评估
  • 搜索框的显示与隐藏(展开与收起)
  • el-input 回显怎么用符号¥和变量拼接展示?
  • openEuler 22.03 LTS Rootless Docker 安装指南
  • MongoDB复杂查询 聚合框架
  • 洛谷 P11247 [GESP202409 六级] 算法学习-普及/提高-
  • pymongo库:简易方式存取数据
  • ETL还是ELT,大数据处理怎么选更靠谱?
  • 步态循环(Gait Cycle)
  • 【MySQL事务和锁】回顾事务
  • 图像质量评价(Image Quality Assessment,IQA)
  • 调试bug记录
  • 【基于飞浆训练车牌识别模型】