- 博客(29)
- 收藏
- 关注
原创 C语言union联合体中不同类型变量读取同一地址数据问题
又由于X86计算机把高字节数据存在高地址,把低字节数据存在低地址(小端字节序)。且int 为4字节,long 为4字节, char 为1字节。所以我们得到的c[0]~c[3]应为78 56 34 12。首先我们明白联合体所有变量公用一段内存。那么显然b的值为0x12345678。
2022-10-06 18:10:30 798 3
原创 C语言结构体链表 节点插入方法(从前和从后)
1.如果是从头节点前插入,则直接令新节点的下一个等于头节点,然后返回新节点即可。第三个参数是要插入的节点的位置,用结构体的值来表示(实际项目可自由更改)第四个参数是插入方式(前AHEAD/后BEHIND)第一步那么新节点的NEXT等于P->NEXT。第一步那么新节点的NEXT等于P->NEXT。第二步P的NEXT指向新节点。第二步P的NEXT指向新节点。第二个参数是要插入的新节点地址。第一个参数是原链表头节点地址。...
2022-07-31 14:45:05 6522
原创 每日一题C语言8
题目:给定一个非空数组,除了某个元素,其他元素都出现了两次,找出那个元素例如:{1,1,2,3,2} 输出 3{1,2,2,3,3} 输出 1说明:你的算法应具有线性复杂度,且你不可以使用额外空间来存放数组思路:此题看似简单,但由于规定不能使用其他数组作缓存变量,故常用的遍历计数法失效了,此时可以使用位运算中的异或运算(^)来实现。异或运算规则如下:a^a=00^a=a所以将数组经过一轮异或后,留下的就是只出现一次的数代码如下:#include <stdio.h>
2022-03-17 15:23:04 701
原创 每日一题C语言7
题目:编写一个原型为 bool isAbsPrime(int n)的函数,用于判断一个数是否为绝对素数,绝对素数是指一个素数,其反置数也为素数,如37为素数,73也为素数,则37,73都为绝对素数注:标准C库中没有bool类型,需要添加头文件 <stdbool.h>来使用bool类型,其返回值为true 和false 相当于数字电路中的0/1;代码如下:#include <stdio.h>#include <stdlib.h>#include <s
2022-03-08 21:10:31 472
原创 每日一题C语言6
题目:我国现行的二代身份证号码是18位数字,由前17位数字本体码和最后1位校验码组成.校验码通过前17位数字根据一定规则计算得出,如果校验码不符合这个规则,那么该号码肯定是假号码.计算方法为:前17位分别乘权重后相加,权重表如下图乘积和除以11得到余数,再将余数从0-10转换为{‘1’,‘0’,‘X’,‘9’,‘8’,‘7’,‘6’,‘5’,‘4’,‘3’,‘2’}对比身份证最后一位是否校验正确,若正确输出出生日期,错误则输出"Fail"思路将身份证读到一个字符串中,再把每个char转换为i
2022-03-07 21:32:33 566
原创 每日一题C语言5
题目:编写toArray()函数,原型为 int toArray(char *str ,char c, int arr[]),输入数字串,将字符串str按字符c分割,并将其中的数字保存到ayy数组中。如输入123,456,789 指定分割字符为 ’ , ’ 则arr[0]=123,arr[1]=456,arr[2]=789思路:现预读一边字符串,将分隔符的位置记录在flag数组中,每次取两个分割符之间的字符(如flag[2]=5,flag[3]=8,则我们要的数据就是第6,7位)到buf进行转换
2022-03-06 21:17:09 528
原创 每日一题C语言4
题目:编写程序把4位16进制字符串转换为短整型数,如“FFF8”转换为-8代码如下:#include <stdio.h>#include <stdlib.h>int main(){ char a[4]; int c[4]; int i; int total=0; int cnt; scanf("%s",a); printf("input:%s\n",a); for(i=0;i<4;i++) {
2022-03-05 14:23:12 541
原创 每日一题C语言3
题目:实现一个六行六列的整型矩阵,初值的十位为行号,个位为列号,(如第1行第6列的值为16,第3行第4列的值为34)再将这个矩阵转置,即第一行元素放在第一列上,第二列的元素放在第二行上,以此类推思路:创建一个结构体存储矩阵的行列数量,值的信息由二维数组来存储,再对该矩阵进行初始化, m.data[i][j] = (i+1)*10+(j+1);关于转置,其实就是把行列的数据互换 output.data[j][i] = input.data[i][j];代码如下#include <
2022-03-03 16:59:45 780
原创 每日一题C语言2
题目:假设有n个元素的一数组a,其中的数据已按由小到大的顺序存放,请编写函数去掉a数组中所有重复的数,只保留不同的数,其余清0,函数返回不同数的个数,函数原型为 int funel( int *a ,int n);例如:数组a中的数据是2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,删除后数组a中前9个元素是2,3,4,5,6,7,8,9,10,其余为0,函数返回9思想:取一个临时数组b,并令其全为0,判断数组a的值与flag是否相同,若不同则将数组a的值放入b,并使
2022-03-02 16:21:47 1060
原创 Arduino-nano 指纹门锁
功能:指纹开门,射频遥控开门硬件:AT301指纹模块,arduino-nano,射频模块,电磁锁,IIC屏幕,贴片(mos管,电阻,电容,稳压管…)代码如下:#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define OLED_RESET -1#define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH .
2022-03-01 15:46:38 1401
原创 每日一题C语言1
输入某年某月某日,判断这一天是这一年的第几天,并输出今年还剩下多少天?例如输入2020,12,25,则输出12月25日为20年的第360天,今年还剩下6天程序如下:#include<stdio.h>#include<stdlib.h>int main(){ int year; int mouth; int day; int output_year1;//年份个位 int output_year2;//年份十位 int output_day1=0;//第几天
2022-03-01 15:24:20 364
原创 Arduino 超声波测距+OLED显示
**Arduino 超声波测距+OLED显示**一.项目简介用超声波测距,实时显示在OLED上面二.接线超声波:VCC->5V GND->GNDTrig->2 Echo->3OLED:VCC->3V GND->GNDSCL(时钟线)->SCL SDA(数据线)->SDA(可参考上图)三.库安装点击管理库搜索关键词为GFX和SSD1306的库,点击install四.模块介绍超声波:OLED:这款屏幕尺寸约为
2021-07-19 16:58:14 6495
原创 树莓派I/O口驱动实现
实现目标:上层输入0/1来驱动底层I/O口输出低/高电平(实现不调用wiringpi库来操作I/O口)(下面拿树莓派的引脚4来举例)步骤:1.根据芯片手册和驱动框架来编写驱动代码2.上层应用制作3.修改Makefile4.交叉编译5.scp传文件到树莓派6.安装驱动,更改权限芯片手册:寄存器的地址问题我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的,然后在这个基础上进行
2021-03-22 14:03:32 299 2
原创 树莓派Linux内核编译
首先我们来讲一下为什么要配置树莓派的linux内核因为要进行驱动代码的编写需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核。一般有这三种方法 第一种方式:cp 厂家.config .config第二种方式:make menuconfig 一项项配置,通常是基于厂家的config来配置第三种方式:完全自己来如何配置树莓派的Linux内核1.把树莓派的Linux内核源码,交叉编译工具拷贝到Linux虚拟机
2021-03-15 11:21:41 328 1
原创 Linux静态库与动态库的相关概念以及编程
一.分模块编程:当我们在实现一个项目的时候,比如wifi小车,我们会碰到超声波模块,电机模块,wifi模块等模块的开发,这时候,我们可以让不同的小组成员来完成不同的模块,作为项目负责人只需要调用他们的模块函数即可。所以分模块编程有以下优点:a.功能责任划分b.方便调试c.主程序简洁二.静态库与动态库1.介绍使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库
2021-02-07 14:06:22 165
原创 Linux--socket网络编程
一.什么是socket:1.socket起源于Unix,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。2.Socke可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个
2021-02-05 17:06:00 205 1
原创 Linux—多线程编程
1.什么是线程: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。在Unix和类Unix操作系统中线程也被称为轻
2021-02-04 01:30:56 534
原创 Linux--进程间通信机制--信号量
1.什么是信号量:信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。信号量是一种特殊的变量,访问具有原子性。只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待;当信号量值大于0时,信号量减1,程序继续运行。2)发送信号量将信号量值加1。讲个比喻:比如有一个房间,门上有一把锁,这个房间同时只允许一个人进去,那么开锁的钥匙,
2021-02-02 21:31:19 181
原创 Linux进程间通信--信号
今天我们来讲一下进程间通信的方式之一:信号我们知道在Linux下要终止一个内涵while(1)的死循环程序时我们都会用到CTRL+C操作。当我们按下这个操作时,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。1.介绍Linux下的信号我们可
2021-02-02 18:31:34 256
原创 Linux进程间通信--共享内存(Shared memory)
今天我们来谈一谈Linux进程间通信的方式之一共享内存我们先来看看共享内存的定义:共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。怎么使用共享内存,有以下几点步骤:1.创建共享内存 shmget
2021-02-01 21:30:41 728 1
原创 Linux进程间通信--消息队列(Message queuing)
今天我们来谈一谈Linux进程间通信的方式之一消息队列我们先来看看关于消息队列的定义:1.消息队列是消息的链表,存放在内核中并由消息队列标识符表示。2.消息队列提供了一个从一个进程向另一个进程发送数据块的方法,每个数据块都可以被认为是有一个类型,接受者接受的数据块可以有不同的类型。但是同管道类似,它有一个不足就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数(MSGMNB),系统上消息队列的总数上限(MSGMNI)。可以用cat /proc/sys/kernel/msgmax查
2021-01-31 18:39:34 640
原创 Linux进程间通信--管道(pipe)与命名管道(FIFO)及其阻塞状态
我们知道进程间通信方式有:管道,FIFO,消息队列,共享存储,信号量,套接字,STREAMS这几种,今天我们来谈一谈pipe和FIFO。首先我们先来看一下定义:管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。我们先来看一下管道:一般管道有这样的应用场景,父进程给一个只写信号到管道,子进程进行读取,或者子写父读。在管道等待输入的过程我们
2021-01-30 14:46:01 1257
原创 Linux下实现在exec配合fork在一定条件下修改配置文件原理
***简述:***在exec程序的进程中创建子进程调用changeData程序来进行修改a.config这个配置文件中的SPEED。首先我们先来看看changeData的代码#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<st
2021-01-29 16:04:08 153
原创 Linux下自己实现cp命令的程序
首先我们来讲一下思路,要拷贝一份文件我们需要以下几点操作:1.打开源文件2.把源文件读出来写到缓冲区(buf)3.打开/创建/重置 最终要的新文件4.将buf里面的东西写到新文件里面5.close两个文件(不要忘记!)我们知道Linux下cp命令一般是三个参数,首先是cp 然后是要复制的文件 在后面是目标文件。比如 cp file1 file2 就是把file1的内容拷贝给file2。那么我们要实现的程序也要有相同的功能,那么从命令操作界面把要操作的文件命传到程序里面去呢,我们用到了两个参数,
2021-01-27 12:03:08 684 2
原创 Linux下的文件读写操作
首先要包含以下头文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>//以上文件操作需要头文件#include<stdio.h>#include<string.h>//strlen#include<stdlib.h>//malloc对于文件读写我们用read和write函数,与c中create函数类似,具
2021-01-26 15:38:46 726
原创 Linux下操作文件为什么最后要close,以及操作文件简单原理阐述
Linux下操作文件为什么最后要close,以及操作文件简单原理阐述1、在Linux中要操作 一个文件,般是先open打开 一个文件, 得到文件描述符,然后对文件进行读写操作 (或其他操作),最后是close关闭文件即可。 2、强调- 一点:我们对文件进行操作时,一定要先打开文件, 打开成功之后才能操作,如果打开失败,就不用进行后边的操作了,最后读写完成后,一定要关闭文件,否则会造成文件损坏。3、文件平时是存放在块设备中的文件系统文件中的,我们把这种文件叫静态文件,当我们去open打开 一一个文件时,I
2021-01-26 14:24:50 2291
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人