關于程序=數據結構+算法這句話最近的一些思考

最近看了很多單片機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
英文地址,請注明出處:http://en.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類型、敏感目錄、端口信息、操作系統版本、網站架構、漏洞信息、服務器與中間件信息、郵箱、人員、地址等。 域名信息收集 拿到公司名或者一個域名&…