- 博客(58)
- 资源 (7)
- 收藏
- 关注
原创 C语言计算2的1024次方
int类型虽然不好表示这么大的数,但是C语言中还有一种long double类型,具体的长度不同的编译器可能略有不同,10字节、12字节、16字节都有。我用的Ubuntu环境,long double类型确实能解决2的1024次方。C语言中的int类型一般占4字节,4个字节就是32位二进制,即使是无符号数,能表示的最大数字也就是2的32次方减一,离2的1024次方还差很远。来一个数组,数组尽量大一些,初始化成1,乘以2的结果分别是2 4 8。这种办法不仅能计算2的1024次方,再大一些,问题也不大。
2023-09-21 12:02:29
874
原创 C语言__attribute__机制
定义两个普通函数,一个before,一个after,分别在函数的上面加上attribute修饰,attribute前后各有两个下划线,括号也是两个叠加在一起,参数一个是constructor,一个是destructor,翻译过来有点像C++里面的构造函数和析构函数。最后,再看一个unused,如果你在代码中定义了静态函数但是没有调用,编译的时候编译器就会提示警告,加上unused,就能消除这个警告。再比如参数mode,用来设置整型的长度,可以是QI,一个字节,可以是HI,两个字节。
2023-03-23 19:30:05
653
1
原创 基于OpenCV的车道偏离预警系统
车道偏离预警 开发环境Ubuntu 16.04OpenCVC++车道偏离预警概念解释车道偏离预警系统,其英文全称为Lane Departure Warning System,因此很多车型上都将车道偏离预警系统简称为LDW系统。其主要功能是通过车辆上的传感器、控制器等部件,在车辆发生无意识偏离车道时通过声音、闪光和振动等方式提醒驾驶员。这篇文章使用OpenCV传统的图像处理方式...
2021-12-05 20:02:04
6955
原创 mjpg-streamer Unable to set format错误
开发环境开发板:NanoPi Duo2 OV5640软件:mjpg-streamer运行结果root@NanoPi-Duo2:mjpg-streamer# ./start.sh MJPG Streamer Version.: 2.0 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 640 x 480 i: Frames Per Second.: 30 i: Format............: YUV i: Displ
2021-11-22 22:47:30
1336
1
原创 抛开数学问题,如何更好的理解PID控制算法?
PID是Proportional(比例)、Integral(积分)、Differential(微分)三者的缩写。PID调节是连续控制系统中技术最成熟、应用最广泛的调节方式。PID调节实质是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。这是书本上对PID的定义,如果没有数学基础,不懂积分、微分,其实很难理解。PID的应用无人机悬停、空调温控、定速巡航…以定速巡航为例子,比如当前速度是0,现在需要用10秒钟的时间把速度提升到100,一个很烂的定速巡航系统可能出现下面.
2021-11-09 21:28:51
733
原创 C语言实现两数相加的三种方法 | 不使用加减乘除求两数和
笔试题里面看到的,总结一下,分享给需要的小伙伴。一、原始办法这种方法最直观明了。int add(int x, int y){ return x + y;}二、利用printf的返回值这个操作鲜为人知。#include <stdio.h>int add(int a, int b){ if(a != 0 && b != 0) return printf("%*c%*c",a,'\r',b,'\r'); else return
2021-07-17 15:55:01
13457
原创 libevent+多线程实现远程通信系统 | 聊天室
开发环境阿里云公网服务器、Windows Qt Creator语言C++实现功能注册、登录、添加好友、聊天、建群、加群、群聊、文件传输、上下线提醒项目演示C++项目 | 阿里云+Qt | 远程通信系统设计 | 仿QQ聊天软件 | 聊天室为什么选择libevent+多线程libevent本身就可以处理大量并发操作。libevent首先创建一个事件集合,然后把所有事件加到集合中(一个客户端可以理解成一个事件)。libevent的主要工作就是不断的监听事件集合,一旦.
2021-03-16 10:09:04
1921
7
原创 关于C语言标准缓冲区的总结
作者 | 学益得智能硬件一、获取多个数据1、获取字符串和字符#include <stdio.h>int main(){ char s1[32] = {0}; char ch; scanf("%s %c", s1, &ch); printf("%s\n", s1); printf("%c\n", ch); return 0;}运行:root@turbo:~# ./test hello chellocr.
2020-12-12 14:49:34
486
原创 入门嵌入式,开发板应该怎么选?
作者 | 学益得智能硬件 入门嵌入式,开发板应该怎么选择?网上推荐的太多,不知道该如何选择。选择开发板,无非考虑三点因素:配套学习资源(源码、视频、书籍);性能(能不能运行学习用到的程序);性价比(价格是不是超出了预算)。下面给大家推荐几款主流的能跑Linux系统的ARM开发板,主要来自两个品牌:迅为和友善之臂。迅为iTOP-4412iTOP-4412开发板【精英版】搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与大容量,纵使海.
2020-11-27 15:32:04
5599
原创 同样是点亮LED,选择单片机还是Linux?
经常有小伙伴问我,做某某某项目到底选择51单片机,还是上Linux操作系统。这个问题对于初学者很难抉择,需要综合考虑项目的性能、功耗、稳定性等等。选择单片机,开发简单,但是性能一般;选择Linux,开发更复杂,但是性能跟的上。下面通过三个点灯案例,跟大家分享一下单片机和Linux的区别。单片机点亮LED硬件平台: 51单片机开发板软件平台: keil、STC烧录工具技术要求: 能看懂简单的电路图;掌握C语言基本语法。难度系数: 极低单片机点灯是所有初学者都会做的一件事情,步骤极其简单:看.
2020-08-26 11:23:32
606
原创 史上最简单的图像识别-百度AI开放平台
提到图像识别,一般都会想到人工智能。虽然现在人工智能还在发展阶段,但是有些技术已经成熟,比如图像识别、语音识别。百度早在2015年之前就已经推出了AI开放平台,涵盖了语音识别、图像处理、视频技术等等。借助第三方平台,AI也可以变的很简单。一、注册百度账号百度搜索「百度AI」,第一个就是。点击右上角「控制台」。用任意一个百度账号都可以登陆。使用百度AI开放平台,需要先创建应用。选择「图像识别」,创建一个新的应用。应用名车和应用描述随便填写。完成后会得到一个API KEY和SECRET KEY,这.
2020-08-14 21:56:52
4090
原创 mini2440+阿里云+Qt/android 打造智能音箱
华为在2018年10月26日发布了一款音箱,AI智能音箱,载了来自猎户星空的语音合成技术。用户通过语音或者华为智能家居App,可轻松控制音箱的播放、暂停等等操作。以华为AI智能音箱为背景,我们自己动手制作一个智能音箱,实现功能如下:音箱本身可以播放音乐,通过按键切换歌曲、暂停继续、调节音量; PC上通过Qt程序可以远程控制音箱的播放,实现和按键相同的功能; 手机端开发Android APP,功能和Qt一样; Qt和Android增加语音识别模块,能识别基本的播放指令。硬件平台m..
2020-08-07 12:16:19
1441
原创 【mjpg-streamer】编写客户端程序,实现视频数据采集
mjpg-streamermjpg-streamer是一个开源的视频服务器,通过摄像头采集数据,放到内存中,再通过socket把视频数据发送出去,最终在web端显示视频数据。mjpg-streamer把采集数据、socket发送数据封装成了两个动态库,一个称作输入插件,一个称作输出插件。使用mjpg-streamer的优势如果我们想做一些跟视频传输相关的项目,完全可以利用mjpg-streamer作为视频数据来源,而不用再关心底层驱动如何实现,驱动视频数据如何读取。mjpg-streamer自带压缩算
2020-08-05 15:07:49
2810
1
原创 【嵌入式修炼之路】-Linux基础之常用工具
学益得线上课堂从基础学习嵌入式玩转智能硬件、斩获高薪offer在正式开始嵌入式学习之前,我们有必要搞懂几个工具,比如编辑器vim、编译器gcc、调试器gdb、工程管理器Makefile,今天就来给大家介绍下vim和gcc,这两个搞不懂,代码都写不了。vim以前的版本叫做vi,两者在配置上略微有区别,操作系统默认都会安装vi,不一定安装vim,所有如果环境里面没有的可以现安装一下。一...
2020-03-30 12:08:11
1358
原创 【嵌入式修炼之路】-Linux基础之常用命令
学习Linux操作系统,第一步当然是学习命令。就好比我们拿到一台Windows电脑一样,先得学会使用鼠标,离开了鼠标,啥也干不成。Linux命令有很多,而且可以说是无穷多个,因为工具实在太多了,每天都会有新的工具出现。就像Windows一样,我们安装一个软件,都会产生一个桌面图标,双击卓妙图标就可以使用。但是Linux里面一般不会提供这种桌面快捷方式,因为很多Linux都没有桌面的,所以我们就得...
2020-03-27 14:52:49
1348
原创 【嵌入式修炼之路】-Linux基础之目录结构
学益得线上课堂从基础学习嵌入式玩转智能硬件、斩获高薪offerLinux和Windows一样,都有分区这个说法,只不过在Windows下面,我们能明确的看到不同的盘符,Linux里面虽然存在,但是看不到。根目录目录是一种很形象的树形结构,每个目录下面都有很多文件、文件夹,可以理解为树枝。如果沿着树枝一直往下寻找的话,最终会找到树根。目录也是一样,如果不停的往上翻(退出目录),最终会退...
2020-03-25 12:22:53
1485
原创 【嵌入式修炼之路】-剖析嵌入式学习路线
学益得线上课堂从基础学习嵌入式开发玩转智能硬件、斩获高薪offerLinux基础作为学习嵌入式的第一步,主要就是搭建嵌入式开发环境。安装虚拟机或者购买云服务器都可以。有了Linux操作系统,下面就是要学会使用Linux,其实就是学习一些常用命令以及如何在Linux下面写代码。推荐书籍C语言C语言是嵌入式开发必备语言,不管是Linux,还是单片机、STM32,都对C语言有极高的要...
2020-03-25 10:35:45
1864
2
原创 嵌入式的下一个发展方向,边缘计算
什么是【边缘计算】,这个概念还得从【云计算】说起。云计算云计算 (cloud computing)指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。通过这项技术,可以在很短的时间内(几秒钟)完成对数以万计的数据的处理,从而达到强大的网络服务。通俗点讲,好比一个项目,以前都是一个人在做。但是随着项目越来...
2020-03-22 19:22:16
2343
原创 【排序】--C语言实现快速排序
快速排序首先简单描述一下快速排序的过程。比如有一组数据:第一步以6为基数,我们要筛选出,比6大的数字,放在6的后面,比6小的数字,放在6的前面。所以需要两个指针(下标)。从y开始,由于【2 < 6】,所以需要用2来覆盖6(不用担心6被覆盖,6已经被记下来了)。同时x++。接下来从x开始。由于【4 < 6】,就应该放在左边,所以不要移动元素4。继续x++。由于【7 >...
2020-03-19 15:30:45
672
原创 【Linux实用工具分享】-- crontab
分享一道网易的笔试题linux系统中有如下cron任务:20,40 */3 * * 1 sh test.sh下面描述正确的是:A 每周一每3小时,20分,40分,运行test.shB 每月1号每3小时,20分,40分,运行test.shC 每周一每3小时,每20分钟运行test.shD 每月1号每3小时,每20分钟运行test.shcron是什么有的时候我们可能需要在Linux里...
2020-03-18 11:01:52
667
原创 【排序】--C语言实现简单插入排序
简单插入排序先把第一个元素当做一个数组,因为如果数组只有一个元素的话,那么它肯定是个有序的序列。然后把第二个元素插入到前面有序的序列中,以此类推。把元素插入有序的序列,先从有序序列的最后一个元素开始比较,如果条件成立(大于或者小于),则元素向后移动。代码#include <stdio.h>#include <stdlib.h>#include <time.h...
2020-03-16 23:00:03
1242
原创 【二叉树】--C语言实现创建二叉搜索树
二叉搜索树创建二叉搜索树的过程很简单,第一个数字作为根,第二个数字,如果比根大,则作为根的右子树,如果比根小,则作为根的左子树。一次类推。对一棵二叉搜索树进行中序遍历,可以的到一个有序的序列。代码#include <stdio.h>#include <stdlib.h>struct Node{ int data; struct Node *le...
2020-03-16 15:26:56
726
原创 如何在Linux下检测程序是否存在内存泄漏?
C语言是嵌入式开发中永远回避不了的语言,不管是操作系统还是裸机开发,无处不体现着C语言的高效。 C语言可以直接操作内存,有着完善的内存管理机制,用好了可以削铁如泥,用不好自断一臂!不管是C还是C++,很多同学都不可避免犯内存泄漏的错误。因为我们平时写的都是些小程序,就算申请的内存没有释放,也不会影响程序结果,所以很少会关注内存泄漏的问题。但是如果把这个问题放在商用的项目中,就会是一个不小的隐患。...
2020-03-09 18:38:41
2800
原创 【排序】--C语言实现基数排序
基数排序基数排序适合整理较大的数据。先根据个位数排序,再根据十位数排序,以此类推,最终得到一组有序的数据。代码复杂的地方是如果收集数据。先定义十个“桶”,将个位按照具体的数字放在对应的“桶”内。收集的过程需要重新申请一块空间,从原始序列的最后一个数字开始,找出它在新序列中的位置,循环完成收集。代码#include <stdio.h>#include <stdlib.h&g...
2020-03-07 21:47:54
1193
原创 【排序】--C语言实现归并排序
归并排序归并排序将两个有序的序列合并成一个有序的序列。如何得到两个有序的序列,把数据不停的拆分,拆到每个序列只有一个数据。所以归并排序用到了递归思想。代码#include <stdio.h>#include <stdlib.h>//两个有序的序列合并成一个有序的序列void Merge(int *a, int start, int mid, int end)...
2020-03-07 13:24:11
1693
原创 【排序】--C语言实现堆排序
堆排序堆排序使用【大顶堆】或者【小顶堆】实现。分为两步:构建堆和调整堆,主要时间都花在了构建堆上。堆排序效率比较高,适用于数据量比较大的场景。代码#include <stdio.h>/*函数描述:构建大顶堆函数参数:数组 根节点的下标 最后一个结点的下标*/void AdjustMaxHeap(int *a, int root, int last){ int ...
2020-03-07 13:14:54
538
原创 【排序】--C语言实现希尔排序
希尔排序希尔排序属于一种插入排序,如果搞懂了直接插入排序,你会发现希尔排序就是多了一层循环。希尔排序比直接插入排序效率高的多,直接插入排序一次只能移动一个位置,但是希尔排序因为多了【增量】的概念,一次可以移动多个位置。把一组无序的数据变得基本有序后最后再使用直接插入排序。代码#include <stdio.h>void InsertSort(int *a, int lengt...
2020-03-07 13:04:26
1544
原创 【小米笔试题】密码破译-C语言实现
题目我们来做一个简单的密码破译游戏。破译的规则很简单,将数字转换为字母,1转化为a,2转化为b,依此类推,26转化为z。现在输入的密码是一串数字,输出的破译结果是该数字串通过转换规则所能产生的所有字符串。输入:多行数据,每行为一个数字串。输出:多行数据,没行对应输出通过数字串破译得到的所有字符串,并按照字符串顺序排列,字符串之间用单个空格分隔,每行开头和结尾不允许有多余的空格。样例输...
2020-03-07 11:40:19
2508
原创 C++ Stack实现四则运算
calculator.cpp#include <iostream>#include <stack>using namespace std;int Priority(char ch){ switch(ch) { case '(': return 3; case '*': case '/': return 2; case '+':...
2020-03-07 11:04:01
839
原创 C语言使用栈实现逆波兰表达式 | 四则运算 | 后缀表达式
calculator.c#include <stdio.h>#include <stdlib.h>#define OK 1000000#define ERROR 1000001struct node{ int data; struct node *next;};typedef struct node Node;struct ...
2020-03-07 10:51:54
1194
C语言提升项目-停车管理系统
2022-04-27
学生管理系统【数组版 链表版 数据库版】
2022-04-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人