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

最近看了很多单片机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.pswp.cn/bicheng/89306.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 错误处理

Rust 错误处理 引言 Rust 是一种系统编程语言,以其安全、并发和性能著称。在 Rust 中,错误处理是一个核心概念,它确保了程序在遇到异常情况时能够优雅地处理。本文将深入探讨 Rust 中的错误处理机制,包括错误类型、错误传播、错误…

17. 什么是 webSocket ?

总结 WebSocket 是 HTML5 引入的一种新协议,允许客户端和服务器之间进行双向实时通信。建立在 TCP 协议之上,默认端口是 80(ws) 和 443(wss),没有同源限制,客户端可以与任意服务器通…

从零开始跑通3DGS教程:(五)3DGS训练

写在前面 本文内容 所属《从零开始跑通3DGS教程》系列文章; 本文介绍在docker中训练3dgs的方法 平台/环境 linux, nvidia GPU, docker 转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/146535874 目录 写在前面系列文章准备docker创建环境参考完系列文章…

日记_7.14_实际开发的进步

1、快速定位后端2、会定位前端啦啦啦!3、前端没有意义的块叫div和span。而不是script4、所有 JavaScript 标识符均 区分大小写5、JS中$和_下划线和doller符均被视为字母。6、var、let区别:1 var全局。let局部。2 var可以重新声明格式,let之恩…

AI Agent 开发

Agent开发常用框架: LangChainLlamaIndexVercel AI SDK LangChain:一站式 LLM 应用开发框架一句话总结 LangChain 把「模型调用 外部数据 工具 记忆 流程编排」全部标准化,让你像搭积木一样快速组合出聊天机器人、RAG、Agent 等大模型应用…

【水动力学】04 二维洪水淹没模型Pypims安装

模型介绍 HiPIMS(High-Performance Integrated hydrodynamic Modelling System)使用最先进的数值方案(Godunov型有限体积法)来求解二维浅水方程以进行洪水模拟。为了支持高分辨率洪水模拟,使用CUDA/C 语言在多个GPU上…

ARC 03 从Github Action job 到 runner pod

Github Action job 分配到集群 背景 job 是 Github Action 的基本单位,每个 job 单独分配一个 runner。workflow 由一个或者多个 job 组成。如果用户触发runs-on字段为arc-runner-set的 job,那么 Github Action 服务器将 job 分配给 listener pod。 源码…

ubuntu 22.04 anaconda comfyui安装

背景: 戴尔R740服务器,安装了proxmox操作系统,配置了显卡直通。创建了一个ubuntu 22.04 VM虚拟机实例,并安装了显卡驱动与cuda等相关配置: 接下来准备搭建一套comfyui的环境,前段时间B站,抖音各…

每日面试题04:volatile字段的原理

在之前面试题02ConcurrentHashMap的底层原理中提到了volatile修饰符,在多线程编程的世界里,数据同步是一道绕不开的坎。当多个线程同时操作共享变量时,“看不见对方的修改”或“代码顺序错乱”往往会导致程序行为异常。而 volatile作为 Java …

【云原生网络】Istio基础篇

文章目录概述基础知识技术架构概述数据平面核心组件网络代理Envoy控制平面核心组件xDS协议Pilot组件其他概述参考博客😊点此到文末惊喜↩︎ 概述 基础知识 背景知识 服务网格(Service Mesh):独立于应用程序的基础设施层&#x…

PySpark Standalone 集群

一、PySpark Standalone 集群概述PySpark Standalone 集群是 Apache Spark 的一种部署模式,它不依赖于其他资源管理系统(如 YARN 或 Mesos),而是使用 Spark 自身的集群管理器。这种模式适合快速部署和测试,尤其在开发和…

图像质量评价(Image Quality Assessment,IQA)

文章目录图像质量评价(Image Quality Assessment,IQA)一、评估方式:主观评估 客观评估1.1、主观评估方式1.2、客观评估方式:全参考 半参考 无参考(1)全参考的方法对比(Full-Refer…

【跟我学YOLO】(2)YOLO12 环境配置与基本应用

欢迎关注『跟我学 YOLO』系列 【跟我学YOLO】(1)YOLO12:以注意力为中心的物体检测 【跟我学YOLO】(2)YOLO12 环境配置与基本应用 【跟我学YOLO】(3)YOLO12 用于诊断视网膜病变 【跟我学YOLO】&a…

Python爬虫实战:研究openpyxl库相关技术

1. 引言 在当今数字化时代,互联网上蕴含着海量有价值的数据。如何高效地获取这些数据并进行分析处理,成为数据科学领域的重要研究方向。网络爬虫作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 openpyxl 作为 Python 中处理 Excel 文件的优秀库,能…

Redis学习其一

文章目录1.NoSQL概述1.1概述1.2Nosql的四大分类2.Redis入门2.1概述2.2基础知识2.2.1基础命令/语法2.2.2Redis为什么单线程还这么快2.3性能测试3.五大数据类型3.1Redis-key3.2String(字符串)3.3List(列表)3.4Set(集合)3.5Hash(哈希)3.6Zset(有…

高性能架构模式——高性能缓存架构

目录 一、引入前提二、缓存架构的设计要点2.1、缓存穿透2.1.1、缓存穿透第一种情况:存储数据不存在2.1.2、缓存穿透第二种情况:缓存数据生成耗费大量时间或者资源2.2、缓存雪崩2.2.1、解决缓存雪崩的第一种方法:更新锁机制2.2.2、解决缓存雪崩的第二种方法:后台更新机制2.3…

ubuntu+windows双系统恢复

文章目录前言一、恢复windows1.直接在grub命令行输入exit退出2.手动查找windows引导文件先ls列出所有磁盘和分区查找各个分区是否包含引导文件设置引导分区以及引导文件路径启动windows二、在windows系统下删除Ubuntu残留引导文件三、准备ubuntu系统引导盘四、安装ubuntu系统五…

使用Dify构建HR智能助理,深度集成大模型应用,赋能HR招聘管理全流程,dify相关工作流全开源。

HR智能助理系统 📋 项目概述 HR智能助理系统是一个基于AI技术的人力资源管理平台,旨在通过智能化工具提升招聘效率,优化候选人评估流程,并提供专业的面试方案生成服务。 🎯 核心价值 提升招聘效率60%:自动化…

PowerBI实现仅在需要图表时显示图表

PowerBI实现仅在需要图表时显示图表实现效果点击维度前:点击维度后:实现步骤第一步,先创建一个矩阵表和一个柱形图第二步,添加一个新卡片图第三步,创建文本度量值Text "⭠ 选择一个地区"第四步,创…

信息收集知识总结

信息收集 在信息收集中,需要收集的信息:目标主机的DNS信息、目标IP地址、子域名、旁站和C段、CMS类型、敏感目录、端口信息、操作系统版本、网站架构、漏洞信息、服务器与中间件信息、邮箱、人员、地址等。 域名信息收集 拿到公司名或者一个域名&…