嵌入式中常用的巧妙方法 - (汇总)

概述

        做项目,掌握以下方法,可提高开发效率,把时间全部放在需求上。

1、快速获取结构体成员大小

#include <stdio.h>   // 获取结构体成员大小
#define  GET_MEMBER_SIZE(type, member)   sizeof(((type*)0)->member)// 获取结构体成员偏移量
#define  GET_MEMBER_OFFSET(type, member)  ((size_t)(&(((type*)0)->member)))typedef struct _test_struct0
{char x;char y;char z;
}test_struct0;typedef struct _test_struct1
{char a;char c;short b;int d;test_struct0 e;
}test_struct1;int main(int arc, char* argv[])
{printf("GET_MEMBER_SIZE(test_struct1, a) = %ld\n", GET_MEMBER_SIZE(test_struct1, a));printf("GET_MEMBER_SIZE(test_struct1, c) = %ld\n", GET_MEMBER_SIZE(test_struct1, c));printf("GET_MEMBER_SIZE(test_struct1, b) = %ld\n", GET_MEMBER_SIZE(test_struct1, b));printf("GET_MEMBER_SIZE(test_struct1, d) = %ld\n", GET_MEMBER_SIZE(test_struct1, d));printf("GET_MEMBER_SIZE(test_struct1, e) = %ld\n", GET_MEMBER_SIZE(test_struct1, e));printf("test_struct1 size = %ld\n", sizeof(test_struct1));printf("GET_MEMBER_OFFSET(a): %ld\n", GET_MEMBER_OFFSET(test_struct1, a));printf("GET_MEMBER_OFFSET(c): %ld\n", GET_MEMBER_OFFSET(test_struct1, c));printf("GET_MEMBER_OFFSET(b): %ld\n", GET_MEMBER_OFFSET(test_struct1, b));printf("GET_MEMBER_OFFSET(d): %ld\n", GET_MEMBER_OFFSET(test_struct1, d));printf("GET_MEMBER_OFFSET(e): %ld\n", GET_MEMBER_OFFSET(test_struct1, e));return 0;
}

运行结果: 

 

2、文件操作

文件操作平时用得很多,为了方便使用,可以自己根据实际需要再封装一层:

#include <stdio.h>   static int file_opt_write(const char* filename, void* ptr, int size)
{FILE* fp;size_t num;fp = fopen(filename, "wb");if (NULL == fp){printf("open %s file error!\n", filename);return -1;}num = fwrite(ptr, 1, size, fp);if (num != size){fclose(fp);printf("write %s file error!\n", filename);return -1;}fclose(fp);return num;
}static int file_opt_read(const char* filename, void* ptr, int size)
{FILE* fp;size_t num;fp = fopen(filename, "rb");if (NULL == fp){printf("open %s file error!\n", filename);return -1;}num = fread(ptr, 1, size, fp);if (num != size){fclose(fp);printf("write %s file error!\n", filename);return -1;}fclose(fp);return num;
}typedef struct _test_data_info
{char a;char c;short b;int d;
}test_data_info;int main(int arc, char* argv[])
{
#define FILE_NAME  "./test_file"test_data_info write_data = { 0 };write_data.a = 1;write_data.b = 2;write_data.c = 3;write_data.d = 4;printf("write_data.a = %d\n", write_data.a);printf("write_data.b = %d\n", write_data.b);printf("write_data.c = %d\n", write_data.c);printf("write_data.d = %d\n", write_data.d);file_opt_write(FILE_NAME, (test_data_info*)&write_data, sizeof(test_data_info));test_data_info read_data = { 0 };file_opt_read(FILE_NAME, (test_data_info*)&read_data, sizeof(test_data_info));printf("read_data.a = %d\n", read_data.a);printf("read_data.b = %d\n", read_data.b);printf("read_data.c = %d\n", read_data.c);printf("read_data.d = %d\n", read_data.d);return 0;
}

运行结果:

 

3、进度条

有时候,加上进度条可以比较方便知道当前的下载进度、写入文件的进度等。

#include <stdio.h>    
#include <string.h>    
#include <windows.h>typedef struct _progress_t
{int cur_size;int sum_size;
}progress_t;void progress_bar(progress_t* progress_data)
{int percentage = 0;int cnt = 0;char proBuf[102];memset(proBuf, '\0', sizeof(proBuf));percentage = (int)(progress_data->cur_size * 100 / progress_data->sum_size);printf("percentage = %d %%\n", percentage);if (percentage <= 100){while (cnt <= percentage){printf("[%-100s] [%d%%]\r", proBuf, cnt);fflush(stdout);proBuf[cnt] = '#';Sleep(1);cnt++;}}printf("\n");
}int main(int arc, char* argv[])
{progress_t progress_test = { 0 };progress_test.cur_size = 82;progress_test.sum_size = 100;progress_bar(&progress_test);return 0;
}

运行结果:

4、日志输出

日志输出常常需要带一些格式。最简单的方式如:

// 定义日志等级
typedef enum {LOG_DEBUG,LOG_INFO,LOG_WARNING,LOG_ERROR,
} log_level_t;// 封装的日志函数
void log_message(log_level_t level, const char* message, const char* file, int line) {switch (level) {case LOG_DEBUG:printf("DEBUG: %s (%s:%d)\n", message, file, line);break;case LOG_INFO:printf("INFO: %s (%s:%d)\n", message, file, line);break;case LOG_WARNING:printf("WARNING: %s (%s:%d)\n", message, file, line);break;case LOG_ERROR:printf("ERROR: %s (%s:%d)\n", message, file, line);break;default:break;}
}// 在代码中使用封装的日志函数
int main() {log_message(LOG_INFO, "This is an info message", __FILE__, __LINE__);log_message(LOG_DEBUG, "This is a debug message", __FILE__, __LINE__);log_message(LOG_WARNING, "This is a warning message", __FILE__, __LINE__);log_message(LOG_ERROR, "This is an error message", __FILE__, __LINE__);return 0;
}

运行结果:

5、总结 

        介绍完毕,希望能帮助到你,蟹蟹参阅!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810511.shtml

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

相关文章

SNRO 编号范围对象管控,唯一ID

事务代码:SNRO 代码引用: DATA: MAXTID TYPE I,NEWNO TYPE CHAR8. CALL FUNCTION NUMBER_RANGE_ENQUEUE EXPORTING OBJECT ZQC57 EXCEPTIONS FOREIGN_LOCK 1 OBJECT_NOT_FOUND 2 SYSTEM_FAILURE 3 OTHERS …

Flutter学习13 - Widget

1、Flutter中常用 Widget 2、StatelessWidget 和 StateFulWidget Flutter 中的 widget 有很多&#xff0c;但主要分两种&#xff1a; StatelessWidget无状态的 widget如果一个 widget 是最终的或不可变的&#xff0c;那么它就是无状态的StatefulWidget有状态的 widget如果一个…

使用echarts控件,小程序分包处理上传失败

原因&#xff1a;在小程序中想要使用echarts控件&#xff0c;但是上传代码失败&#xff0c;错误码为主包超过2.5M&#xff0c;基于此&#xff0c;我们使用分包处理&#xff0c;并上传版本。 错误&#xff1a; 使用echarts&#xff1a;在小程序中引入echarts相关文件。 解决方式…

Arduino 项目笔记 |TH1621 LCD液晶显示屏驱动(SSOP-24封装)

LCD液晶屏资料 LCD液晶屏资料 重要参数&#xff1a; 工作电压&#xff1a; 3V可视角度&#xff1a;1201/4 &#xff0c;1/3 TH1621 驱动 HT1621 LCD控制驱动芯片介绍 VLCD 和 VCC 电压符合规格书&#xff0c;最好都取3.3V 。电压太高或太低都会出现段码液晶屏乱码的情况&am…

vue 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法

vue 的设计模式 —— MVVM M —— Model 模型&#xff0c;即数据V —— View 视图&#xff0c;即DOM渲染VM —— ViewModel 视图模型&#xff0c;用于实现Model和View的通信&#xff0c;即数据改变驱动视图渲染&#xff0c;监听视图事件修改数据 初次渲染 将模板编译为 render …

【Mybatis-Plus】Mybatis-Plus增删改查示例

示例一&#xff1a;delete 这个删除&#xff0c;是我们直接可以把这条记录给放进去&#xff0c;那么这条记录里面如果说有的属性为空的话&#xff0c;它是不会去管的&#xff0c;但是有些属性它不为空的话&#xff0c;那么它就会根据属性。作为一个equal的条件去做一个删除的一…

msvcr120.dll丢失的解决办法,msvcr120.dll文件丢失的相关介绍

今天小编在使用电脑的时候&#xff0c;突然弹出了一个关于msvcr120.dll文件丢失的问题&#xff01;当出现这种情况时&#xff0c;相信大家都会感到困惑吧&#xff1f;不过&#xff0c;别担心&#xff01;下面就来和大家分享一下解决msvcr120.dll文件丢失问题的几种方法&#xf…

城市内涝与海绵城市规划设计中的水文水动力模拟

原文链接&#xff1a;城市内涝与海绵城市规划设计中的水文水动力模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601198&idx5&sn35b9e5e3961ea2f190f9742236a7217f&chksmfa820dc9cdf584df97633f64d19bdc3e5f7d1a5a85000c8f040e1953c51b9b39c87b5…

Docker 集成 redis,并在nacos进行配置时需要注意点

安装redis镜像 docker pull redis:6.0.6redis配置文件 创建相关配置文件 mkdir /apps/redis cd /apps/redis touch redis.conf vim redis.confredis.conf内容&#xff1a; #开启保护 protected-mode yes #开启远程连接 bind 0.0.0.0 #自定义密码 port 6379 timeout 0 # 900s内…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…

DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

-创建了一个开放的AI Gym环境&#xff0c;包括多旋翼和固定翼无人机的运动学模型。 -提供了一些UE4环境来训练和测试深度强化学习DRL导航策略。 -基于AirSim和SB3。 完整代码链接见文末。 DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

Linux-docker安装数据库redis

1.拉取redis镜像 docker pull redis # 下载最新的redis版本 docker pull redis:版本号 # 下载指定的redis版本ps&#xff1a;我这是已经下载最新版本的redis 2.查看redis镜像 docker images3.创建挂在路径并授权 mkdir -p /usr/local/redis/data mkdir -p /usr/local…

AI大模型基石:文字与数字的起源与演变

AI大模型基石&#xff1a;文字与数字的起源与演变 1、文字 1.1、起源 我们的祖先在还没有发明文字和语言之前就已经开始使用“咿咿呀呀”的声音来传播信息了&#xff0c;比如在野外活动遇到危险&#xff0c;然后发出“咿咿呀呀”的声音来提醒同伴小心&#xff0c;同伴在接收到…

向大众日报投稿需要准备哪些材料?

向大众日报投稿通常需要准备以下材料&#xff1a; 稿件正文&#xff1a;这是投稿的核心部分&#xff0c;确保内容符合大众日报的主题和风格。作者信息&#xff1a;包括姓名、联系方式&#xff08;如电话、邮箱等&#xff09;。个人简介&#xff1a;简要介绍自己的背景和相关经…

数据结构--链式栈

一.链式栈的栈顶在哪里? 二.链栈的结构: typedef struct LSNode{ int data; struct LSNode* next; }LSNode ,*PLStack; //链栈的节点.由于栈顶在第一个数据节点,所以不需要top指针 三.链式栈的实现: //初始化LSNode* p (LSNode*)malloc(sizeof(LSNode));assert(p ! NULL)…

03-JAVA设计模式-享元模式

享元模式 什么是享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种对象结构型设计模式&#xff0c;用于减少创建对象的数量&#xff0c;以减少内存占用和提高系统性能。它通过共享已经存在的对象来避免创建大量相似的对象&#xff0c;从而降低内存消耗。 在…

蓝桥杯真题Day48 倒计时5天 练了几道真题小程序+回溯剪枝应用一个小程序

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从0到 n−1&#xff0c;你可以将其视作是一个具有n位的十进制数字num&#xff0c;小蓝可以从num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次…

如何在 JavaScript 中创建自定义事件?

理解 JavaScript 中的事件 在深入研究自定义事件之前&#xff0c;我们首先了解 JavaScript 中事件的概念。事件是浏览器中发生的操作或事件&#xff0c;由用户交互&#xff08;如单击、鼠标移动或键盘输入&#xff09;或浏览器本身&#xff08;如页面加载、调整大小等&#xf…

算法——栈

. - 力扣&#xff08;LeetCode&#xff09; 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 class Solution { public:string removeKdigits(string num, int k…

【Shell语言学堂】数组练习题

数组练习 1、使用数组和循环实现冒泡排序2、将冒泡排序的代码重构为2个函数&#xff0c;2个关系是a函数调用b函数自定义数组参数&#xff1a; 3、声明一个存储的全整数数组&#xff0c;对其中的每一个值进行10处理4、对硬盘使用空间占比的排序5、对当前目录的文件大小进行排序 …