分享几个实用的代码片段(第二弹)

大家好,我是杂烩君。

本次我们再来分享几个实用的代码小片段。

快速获取结构体成员大小

获取结构体成员大小及偏移量的方式有多种。最简便的方式:

代码:

左右滑动查看全部代码>>>

// 微信公众号:嵌入式大杂烩#include// 获取结构体成员大小#defineGET_MEMBER_SIZE(type, member) sizeof(((type*)0)->member)// 获取结构体成员偏移量#defineGET_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”, GET_MEMBER_SIZE(test_struct1, a));printf(“GET_MEMBER_SIZE(test_struct1, c) = %ld”, GET_MEMBER_SIZE(test_struct1, c)); printf(“GET_MEMBER_SIZE(test_struct1, b) = %ld”, GET_MEMBER_SIZE(test_struct1, b)); printf(“GET_MEMBER_SIZE(test_struct1, d) = %ld”, GET_MEMBER_SIZE(test_struct1, d));printf(“GET_MEMBER_SIZE(test_struct1, e) = %ld”, GET_MEMBER_SIZE(test_struct1, e));printf(“test_struct1 size = %ld”, sizeof(test_struct1)); printf(“GET_MEMBER_OFFSET(a): %ld”, GET_MEMBER_OFFSET(test_struct1, a)); printf(“GET_MEMBER_OFFSET(c): %ld”, GET_MEMBER_OFFSET(test_struct1, c)); printf(“GET_MEMBER_OFFSET(b): %ld”, GET_MEMBER_OFFSET(test_struct1, b)); printf(“GET_MEMBER_OFFSET(d): %ld”, GET_MEMBER_OFFSET(test_struct1, d)); printf(“GET_MEMBER_OFFSET(e): %ld”, GET_MEMBER_OFFSET(test_struct1, e)); return 0;}

运行结果:

文件操作

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

代码:

左右滑动查看全部代码>>>

// 微信公众号:嵌入式大杂烩#includestatic 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!”, filename);return -1; }num = fwrite(ptr, 1, size, fp);if(num != size){fclose(fp);printf(“write %s file error!”, 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!”, filename);return -1;}num = fread(ptr, 1, size, fp);if(num != size){fclose(fp);printf(“write %s file error!”, filename);return -1;} fclose(fp);return num;}typedef struct _test_struct{ char a; char c;short b;int d;}test_struct;int main(int arc, char *argv[]){#define FILE_NAME”./test_file”test_struct write_data = {0};write_data.a = 1;write_data.b = 2;write_data.c = 3;write_data.d = 4;printf(“write_data.a = %d”, write_data.a);printf(“write_data.b = %d”, write_data.b);printf(“write_data.c = %d”, write_data.c);printf(“write_data.d = %d”, write_data.d);file_opt_write(FILE_NAME, (test_struct*)&write_data, sizeof(test_struct));test_struct read_data = {0};file_opt_read(FILE_NAME, (test_struct*)&read_data, sizeof(test_struct));printf(“read_data.a = %d”, read_data.a);printf(“read_data.b = %d”, read_data.b);printf(“read_data.c = %d”, read_data.c);printf(“read_data.d = %d”, read_data.d); return 0;}

运行结果:

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:嵌入式物联网学习资料(头条)

进度条

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

代码:

左右滑动查看全部代码>>>

// 微信公众号:嵌入式大杂烩#include #include #include typedef struct _progress{int cur_size;int sum_size;}progress_t;void progress_bar(progress_t *progress_data){int percentage = 0;int cnt = 0;char proc[102];memset(proc, ”, sizeof(proc));percentage = (int)(progress_data->cur_size * 100 / progress_data->sum_size);printf(“percentage = %d %%”, percentage);if (percentage <= 100){while (cnt <= percentage){printf("[%-100s] [%d%%]r", proc, cnt);fflush(stdout);proc[cnt] = '#';usleep(100000);cnt++;}}printf("");}int main(int arc, char *argv[]){progress_t progress_test = {0};progress_test.cur_size = 65;progress_test.sum_size = 100;progress_bar(&progress_test);return 0;}

运行结果:

日志输出

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

代码:

左右滑动查看全部代码>>>

// 微信公众号:嵌入式大杂烩#include#define LOG_D(fmt, args…) do{printf(” “, __FILE__, __LINE__, __FUNCTION__);printf(fmt, ##args);}while(0)int main(int arc, char *argv[]){char ch = ‘a’;char str[10] = “ZhengN”;float float_val = 10.10;int num = 88;double double_val = 10.123456;LOG_D(“字符为 %c “, ch);LOG_D(“字符串为 %s ” , str);LOG_D(“浮点数为 %f “, float_val);LOG_D(“整数为 %d” , num);LOG_D(“双精度值为 %lf “, double_val);LOG_D(“八进制值为 %o “, num);LOG_D(“十六进制值为 %x “, num); return 0;}

运行结果:

可阅读往期文章:

C语言、嵌入式中几个非常实用的宏技巧

一个简单的日志模块

后台运行生成core文件

这个是我们上一篇文章分享一种你可能不知道的bug定位方法介绍的,方便大家使用,也汇总在这里。

代码:

左右滑动查看全部代码>>>

// 微信公众号:嵌入式大杂烩#include #include #include #include #define SHELL_CMD_CONF_CORE_FILE”echo /var/core-%e-%p-%t > /proc/sys/kernel/core_pattern”#define SHELL_CMD_DEL_CORE_FILE “rm -f /var/core*”static int enable_core_dump(void){int ret = -1;int resource = RLIMIT_CORE;struct rlimit rlim;rlim.rlim_cur = 1 ? RLIM_INFINITY : 0;rlim.rlim_max = 1 ? RLIM_INFINITY : 0;system(SHELL_CMD_DEL_CORE_FILE);if (0 != setrlimit(resource, &rlim)){printf(“setrlimit error!”);return -1;}else{system(SHELL_CMD_CONF_CORE_FILE);printf(“SHELL_CMD_CONF_CORE_FILE”);return 0;}return ret;}int main(int argc, char **argv){enable_core_dump();printf(“==================segmentation fault test==================”);int *p = NULL;*p = 1234;return 0;}

以上就是本次分享的几个小的代码片段。

期待你的三连支持!

原文作者:杂烩君

作品来源:嵌入式大杂烩

来源链接:https://mp.weixin.qq.com/s/_YIlvFdVYPLAUkyGsn3u3g

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年9月22日
下一篇 2022年9月22日

相关推荐

  • Spring Boot 业务逻辑层

    关于业务逻辑层(Service层) 业务逻辑层是被Controller直接调用的层(Controller不允许直接调用持久层),通常,在业务逻辑层中编写的代码是为了保证数据的完整性…

    2022年6月13日
  • 请查收 2022华为开发者大赛备赛攻略

    创想无限!2022华为开发者大赛已在全球六大赛区陆续启动报名,目前已有超4100名参赛者、1000支团队报名参赛。 其中有你吗?别再观望了,带上这份超全的开发技术要点攻略,战一波,…

    2022年8月11日
  • 已然迈入“决赛圈”!华为官宣:鸿蒙3.0版本将正式和安卓决裂

    已然迈入“决赛圈”!华为官宣:鸿蒙3.0将正式和谷歌“决裂”。 “缺芯少魂”一直困扰着中国市场,在中低端芯片上还能实现一定的国产化,但要说到操作系统,此前可谓被垄断得密不透风。 苹…

    2022年7月2日
  • 嵌入式软件架构设计-程序分层

    1 前言 在嵌入式MCU软件开发过程中,程序分层设计也是重中之重,关系到整个软件开发过程中的协同开发,降低系统软件的复杂度(复杂问题分解)和依赖关系、同时有利于标准化,便于管理各层…

    2022年6月26日
  • 计算机专业丨学完一年编程还是不会写代码,问题到底出在哪?

    这几年的教学工作做下来,发现无论是计算机专业的学生,还是把编程作为公修课的其他专业学生,很多人内心都有一个灵魂拷问——为什么我认真听课,认真看书书,几个月甚至一年下来但还是写不好代…

    2022年6月29日
  • Git 重命名远程分支 – 操作不规范,亲人两行泪

    TIPS:以下代码示例语言为Go 问题描述 小A和我并行开发,他在优化之前的代码逻辑,我在开发新功能。 小A在我之前把代码提交到了测试分支,我想提交我的新功能代码到测试分支时发现巨…

    2022年7月3日
  • SpringBoot统一封装返回前端结果集

    在实际项目开发过程中、事实上我们经常用@restcontroller注释的方式,将相当于将返回数据的基本形式统一为JSON格式的数据。但是,由于我们的项目可能是由很多人开发的,所以…

    2022年6月14日
  • 你能想到是一位女性帮助美国宇航局登陆月球吗?

    1969 年,美国宇航局依靠软件工程师玛格丽特·汉密尔顿将阿波罗 11 号的宇航员安全降落在月球表面,并将他们带回家。 1969 年 7 月 20 日,任务控制中心的屏幕上闪烁着警…

    2022年8月16日
  • NodeJS,url、querystring和querystringify模块,接收请求参数

    NodeJS提取网址参数 querystringify模块 querystring,将url请求地址后的参数转化为对象,也可以把对象转化为url后的参数,便利对url的操作,npm…

    2022年6月17日
  • ncnn+PPYOLOv2首次结合!全网最详细代码解读来了

    编辑:好困 LRS 【新智元导读】今天给大家安利一个宝藏仓库miemiedetection ,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三…

    2022年8月13日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息