当前位置: 首页 > 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.dtcms.com/a/282275.html

相关文章:

  • 【数据结构】「栈」(顺序栈、共享栈、链栈)
  • iOS 抓包工具选择与配置指南 从零基础到高效调试的完整流程
  • 时序大模型为时序数据库带来的变革与机遇
  • Flutter 记录 使用ModalRoute获取参数
  • flutter app内跳转到其他安卓 app的方法
  • qt udp接收时 丢包
  • 安卓开发使用Android Studio配置flutter环境
  • 《Qt信号与槽机制》详解:从基础到实践
  • Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
  • 《Qt实战开发》:从计算器到音乐播放器的全栈实现指南
  • 7月16日作业
  • QOpenGLWidget自定义控件— 2D点云显示(支持平移、放缩、绘制网格)
  • 桥下的蓝色风景线
  • 数据库连接池调优以及常见问题
  • SSM框架学习——day3
  • 如何解决WordPress数据库表损坏导致的错误
  • Python 测试全景:单元测试、集成测试与端到端测试实战指南
  • 【收银系统源码】-适用于零售餐饮连锁多门店
  • Docker化Web服务部署全景指南:从基础服务器到企业级应用
  • VUE指令大全
  • 使用Node搭建一个直播服务器,实时直播当前桌面
  • WAMP允许远程访问
  • WAN技术
  • 基于 Python/PHP/Node.js 的淘宝 API 商品数据抓取开发教程
  • 高德mcp结合智能体生成旅游计划推荐
  • Typecho插件开发:自定义表单验证规则addRule实战指南
  • 20250716|【继续19的快慢指针】Leetcodehot100之237【pass】今天计划
  • python--杂识--20 sse与websocket区别
  • 【RTSP从零实践】13、TCP传输AAC格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)
  • 算法学习笔记:25.回溯算法之迷宫寻路——从原理到实战,涵盖 LeetCode 与考研 408 例题