C语言
文章平均质量分 89
我不叫小海南
这个作者很懒,什么都没留下…
展开
-
学生管理系统C语言实现
近期做了一个学生管理系统,巩固了下文件io的知识!虽然只是一个小项目,不管对项目开发的认识有了一个小的提升。下面贴出各部分工作的代码。在codeblocks上编译完美运行。先上图,程序运行后的菜单界面:有基本的增删改查功能,还多了排序和统计的辅助功能。接下来分头文件和各个函数说明程序实现原理。1.结构体头文件Studen.h(注意:头文件和.c文件不在同一个目录下,所以导入头文原创 2017-06-20 13:14:41 · 2352 阅读 · 0 评论 -
mplayer解码库的移植
---------linux系统的多媒体处理---------音频解码库:madplay 视屏解码:mplayer 音频录制:alsa-----------------------------------开源免费-------------------------------------1.解压源码把所有的源码包复制到/home/ge原创 2017-08-06 23:20:11 · 1295 阅读 · 0 评论 -
线程的简单介绍与实现
线程和进程 线程:是系统调度的基本单位 进程:是系统分配资源的基本单位为了任务处理linux系统引入了进程的概念去实现多任务处理: 进程的特点:1.进程间的内存空间是互相独立的。 2.进程是系统分配资源的最少单位 -》每创建一个进程系统都会进行一次资源分配原创 2017-08-05 23:57:01 · 205 阅读 · 0 评论 -
进程间通信——信号
信号 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而原创 2017-08-05 23:52:24 · 281 阅读 · 0 评论 -
进程间通信——信号量
信号量信号量的作用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。为什么要使用信号量?因为共享内存是可以由多个进程同时访问,假如有多个进程同时访问同一块地址的话,内存就会出错,或者是运算错误,所以当某个进程访问共享内原创 2017-08-05 23:37:55 · 261 阅读 · 0 评论 -
进程间通信——共享内存
共享内存共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下:为什么要使用共享内存?因为管道通信,每次都要调用系统IO,调用系统IO是很损耗系统资源的,假如有某些数据,进程之间是频繁访问的,我们就可以在系统中申请一片内存让他们共同访原创 2017-08-05 23:35:44 · 212 阅读 · 0 评论 -
进程间通信——消息队列
什么是消息队列?消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。查看系统中ipc的数量:ipcs -m shared memory segments原创 2017-08-05 23:32:48 · 201 阅读 · 0 评论 -
进程间通信——管道
为什么要学习进程通信?因为复杂程序都是多任务的,进程间需要相互协作,但进程间的内存空间又是独立的,所以需要掌握进程的通信让他们相互协作。管道的概念:管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:1. 其本质是一个伪文件(实为内核缓冲区)2. 由两个文件描述符引用,一个表示原创 2017-08-05 23:30:59 · 248 阅读 · 0 评论 -
lcd设备图像显示
lcd设备的分辨率---》7寸(800*480个像素点)像素点:组成图片的基本元素 32位色---》一个像素点通过ARGB来组成 24位色---》一个像素点通过RGB来组成 16位色---》一个像素点通过两位数组来组成分辨率:单位面积内能显示像素点的数量(分辨率越高,图像越清晰)图片格式:原创 2017-07-22 17:43:53 · 838 阅读 · 0 评论 -
TCP服务器、客户端的简单实现
1. IP地址(IPV4 IPV6) 以一个32位的整形表示:172.166.111.110 -》点分10进程 地址 255.255.255.255 表示为 FF FF FF FF ->二进程 2.IP地址分类A类地址:0.0.0.0 -- 127.255.255.2原创 2017-08-06 23:24:13 · 513 阅读 · 0 评论 -
UDP服务器、客户端的简单实现
TCP协议和UDP协议的区别:TCP:面向连接,传输可靠(保证数据正确性,保证数据顺序),用于传输大量数据(流模式),速度慢,建立连接需要开销较多。UDP:面向非连接,传输不可靠,用于传输少量数据(数据包模式),速度快。UDP协议的搭建流程---------------------------UDP通信接收端-----------原创 2017-08-06 23:27:15 · 1226 阅读 · 0 评论 -
C中不安全的函数以解决办法汇总
C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库。最有害的罪魁祸首是不进行自变量检查的、有问题的字符串操作(strcpy、strcat、sprintf 和 gets)。一般来讲,像“避免使用 strcpy()”和“永远不使用 gets()”这样严格的规则接近于这个要求。 这些函数由于设计的时候比较淳朴,并没有做任何的越界检测,主要容易"被溢出",只需要多设点检查边界,转载 2017-09-18 10:18:48 · 930 阅读 · 0 评论 -
sqlite3数据库ubuntu移植&arm开发板移植
sqlite3数据库下载地址PC版:1.解压tar xvf sqlite-autoconf-3190300.tar.gzcd sqlite-autoconf-31903002.检查、配置(如果成功,会生成Makefile) --prefix=PREFIX:指定安装目录./configure --prefix=/home/csgec/bui原创 2017-08-06 23:47:19 · 791 阅读 · 0 评论 -
sqlite3数据库命令
SQL:结构化查询语言 Structrue Query Language是所有关系型数据库管理系统的标准语言 非过程化语言只需要去定义期望结果,将产生结果的过程交给外部代理(数据库引擎)来定义根据SQL语言的功能可以这样分类:数据定义语言:DDL创建表:CREATE TABLE IF NOT EXISTS 表名(原创 2017-08-06 23:50:50 · 427 阅读 · 0 评论 -
数据库介绍
数据库:基础接口---------------1.数据 data描述事件的符号记录,包括数字、字符串、图像、音频、影像等,它们都可经过数字化存入计算机2.数据库 database存储数据的仓库,有组织、可共享的数据集合,按照数据结构来组织、存储和管理数据3.数据库管理系统 DBMSDBMS应该提供如下功原创 2017-08-06 23:49:16 · 300 阅读 · 0 评论 -
alsa库的移植
1.下载alsa-1.0.tar.gz 到开发板下载地址2.解压alsa-1.0.tar.gz库tar -xzvf alsa-1.0.tar.gz3.把alsa库中的所有工具下载到/bin目录 cd /alsa-1.0.22/bin cp * /bin -R 4.把alsa库中的所有库下载到/原创 2017-08-06 23:36:25 · 576 阅读 · 0 评论 -
UDP组播
UDP组播的搭建流程-----------------------------------------------------------------------------------------------------------------------------【murecv.c】#include #include原创 2017-08-06 23:35:02 · 411 阅读 · 0 评论 -
IO多路复用
读写IO 阻塞I/O: 读::read一个文件,假如文件没有数据则读取会阻塞直到有数据时,返回数据的大小或读错误 写: write一个文件,写一般不会阻塞,但是当要写入的空间写满时,写就会阻塞,等待空间中有地方可写时,才再次写入,或写失败。 非阻塞I/O: O_NONBLOCK原创 2017-08-06 23:33:00 · 286 阅读 · 0 评论 -
套接字选项&UDP广播
套接字选项(socket options)每个套接字在不同的协议层次(级别)上有不同的行为属性(选项),有两个函数用来设置或获取这些套接字选项getsockoptsetsockoptNAME getsockopt, setsockopt - get and set options on socketsSYNOPSIS #inc原创 2017-08-06 23:31:16 · 1042 阅读 · 0 评论 -
进程的简单介绍与实现
什么是进程?什么是程序?进程在系统中能够独立运行,并分配资源的基本单位。而程序由多个进程组成,一个程序最少有一个进程。进程是动态的,程序是静态的。进程控制块(PCB)在Linux中task_struct结构体即是PCB。PCB是进程的唯一标识,PCB由链表实现(为了动态插入和删除)。进程创建时,为该进程生成一个PCB;进程终止时,回收PCB。PCB包含信息:原创 2017-08-05 23:19:38 · 326 阅读 · 0 评论 -
sqlite3数据库函数
数据库操作的基本步骤:0.连接数据库1.打开数据库2.操作数据库3.关闭数据库sqlite3的基本元素:两个对象与八个方法一.封装系列1.建立连接、打开数据库int sqlite3_open( const char *filename, /* 字符串形式的数据库名(UTF-8),存在则打开,不原创 2017-08-11 18:09:26 · 2674 阅读 · 1 评论 -
线性表之栈的顺序存储实现
栈是一种受限制的线性表,说其受限制是因为它的插入和删除只能在栈顶操作。栈的特性是后进先出,所以也将栈称为后进先出(LIFO)表。 栈的顺序存储也称为线性栈,是利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。用栈顶指针top来标识栈顶元素在顺序栈中的位置。栈的结构体表示:typedef struct { int dat原创 2017-07-10 19:47:23 · 274 阅读 · 0 评论 -
双向循环链表的简单实现
双向循环链表:双向循环链表和双向链表的不同之处,是双向循环链表的尾部节点的next不指向NULL,而是指向第一个节点,而第一个节点的pre是指向尾部节点的。双向循环链表的结构:(以下示意图均摘自来源: http://blog.csdn.net/fisherwan/ar)双向循环链表的初始化:链表中只有一个节点,原创 2017-07-10 19:40:38 · 2484 阅读 · 0 评论 -
双向链表的简单实现
双向链表:双向链表和单向链表的不同之处是它的指针域有指向前驱的指针pre和指向后驱的指针next。typedef struct double_list{ int date; struct double_list *pre; struct double_list *next;}list;双向链表的构成:(以下示意图均摘自来原创 2017-07-10 19:35:21 · 1602 阅读 · 1 评论 -
单向循环链表的简单实现
单向循环链表: 在单向链表中,头指针是相当重要的,因为单向链表的操作都需要头指针,所以如果头指针丢失或者破坏,那么整个链表都会遗失,并且浪费链表内存空间。单向循环链表的构成: 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表。单向链表结构图示:(以下示意图均摘自来源: http://blo原创 2017-07-10 19:31:14 · 25274 阅读 · 8 评论 -
单链表的简单实现
单向链表:单向链表中的每一个节点都有一个存储数据的数据域,和一个指向下一个元素内存地址的指针域一个简单结点用结构体表示为: struct single_list { int data; //数据成员可以是多个不同类型的数据 struct note *next; //原创 2017-07-10 19:25:26 · 490 阅读 · 0 评论 -
c语言错误大全
1: Ambiguous operators need parentheses — 不明确的运算需要用括号括起2: Ambiguous symbol xxx — 不明确的符号3: Argument list syntax error — 参数表语法错误4: Array bounds missing — 丢失数组界限符5: Array size toolarge — 数组尺寸太大6: Bad cha转载 2017-06-10 20:22:40 · 3523 阅读 · 0 评论 -
文件IO操作大全
一、文件基本知识“文件是指一组相关数据的有序集合”,这个数据集的名称就是文件名。所有文件都是通过流的形式进行输入输出操作的。流是一个数据字节的序列。流入程序的流称为输入流,流出程序的流称为输出流。流可分为两大类:文本流和二进制流(1)文本刘是一种字符序列,仅包含字符。(2)二进制流是一种二进制序列,与外设中的字节序列一一对应,不对字节中的内容进行转换,如遇到换行符也不会执行换行操作原创 2017-06-10 12:42:51 · 3943 阅读 · 1 评论 -
线性表之顺序存储
线性表: 是具有相同特性的数据元素组成的一个有限序列。例如使用一个线性表来存取学生的学号,可表示成(1,2,3,4,5,6,7,8,9,10)线性表的存储结构分为顺序存储和链式存储。线性顺序存储 c/c++程序中的数组或字符串结构就是一种典型的线性表应用,特性是使用连续的存储空间来存储数据,在编译时就需要为相关变量分配内存,原创 2017-07-10 19:15:49 · 400 阅读 · 0 评论 -
顺序队列
队列就像日常生活中的排队买票一样,新来的要排到队伍的末尾,在队头的买完票就可以出队。先来的先离开,后来的后离开,所以队列也叫先进先出表(FIFO)队列和栈一样,也是一种受限制的线性表。队列只允许在队列头进行退出,在队列尾进行插入。向队列中插入元素称为入队,删除元素称为出队。队列中会有一个指向队头的指针称为对头指针,有一个指向队尾的指针称为队尾指针。出队操作:当有元素出队原创 2017-07-10 20:18:49 · 284 阅读 · 0 评论 -
链式队列
用链表来实现的队列为链式队列。用指针front和rear分别指向队头和队尾。同顺序队列一样,也是在front处出队,在rear处入队。与顺序队列不同,链式队列的rear指针指向最后一个元素。链式队列的C语言实现:(codeblocks完美运行)#include #include typedef struct node{ int data;原创 2017-07-10 20:23:58 · 469 阅读 · 0 评论 -
文件IO
标准IO头文件: #include 1.打开一个文件 FILE *fopen(const char *path,const char *mode);参数一:要打开的文件路径参数二:打开的方式 r 以只读的方式打开文件 r+ 以读写的方式打开文原创 2017-07-22 17:25:24 · 218 阅读 · 0 评论 -
stat查看文件属性
头文件: #include > #include #include 查看文件属性函数有: int stat(const char *path,struct stat *buf); int fstat(int fd,struct stat *buf); int lstat(const char原创 2017-07-22 17:41:50 · 729 阅读 · 0 评论 -
内存映射函数mmap
内存映射:把系统空间里面的内容与用户空间共享,提高用户操作设备的效率。头文件: #include 映射函数原型: void *mmap( void *addr, ---》要映射到内存的那一个地址上 填写为NULL让系统自动分配 size_t length, ---》要映射的空间大小 int原创 2017-07-22 17:42:43 · 467 阅读 · 0 评论 -
bmp图片解码
#include #include #include #include #include #include #include void drw_poin(unsigned int *lcdfd,int x,int y,int color){ *(lcdfd+x+y*800) = color;}原创 2017-07-22 17:44:31 · 2362 阅读 · 0 评论 -
jpeg源码库移植到linux系统
jpeg解码库的移植:1.将下载的jpeg源码复制到/home/gec注意:共享目录不支持链接文件,所以不能在共享目录进行该操作cp jpegsrc.v8a.tar.gz /home/gec2.解压jpeg源码tar -xzvf jpegsrc.v8a.tar.gz3.在/home/gec下新建jpeg目录mkdi原创 2017-07-22 17:45:34 · 1111 阅读 · 1 评论 -
系统IO
linux系统,一切皆文件!c ---》字符设备文件(传输数据是字节的形式传输的)键盘,鼠标,游戏遥感,蓝牙耳机d ---》目录文件l ---》 链接文件b ---》块设备文件(传输时带缓存1024字节的设备文件)U盘,硬盘s ---》网络套接字文件(用于网络通信)p ---》管道文件(用于进程通信)#include原创 2017-07-16 17:19:58 · 474 阅读 · 0 评论 -
线性表之链式存储
线性表的链式存储 c/c++程序的链表是以指针变量来实现线性表的数据结构,特性是使用不连续的存储空间来存储数据,内存分配是在执行时才会发生,不需要实现声明,这种分配方式称为动态内存分配。优点:①因为是使用时才分配内存,所以不会造成储存空间的浪费 ②由于地址空间不连续,在进行插入和删除操作时不需要移动其他数据的地址,只需修改指针指向的位置。因此插原创 2017-07-10 19:23:40 · 201 阅读 · 0 评论 -
循环队列
为了解决顺序队列中的“假溢出”现象,充分利用数组的存储空间,可将顺序队列的头尾相连,构成一个循环队列。循环队列一般都是用数组来实现的。在循环队列中,front和rear都是可以移动的。当队列为空或满时,front = rear都成立,所以不能用这个条件来判断队列是空的还是满的。为了解决这个问题,在循环队列中有一个约定:少用一个元素空间,当队尾标识rear原创 2017-07-10 20:25:37 · 949 阅读 · 0 评论 -
线性表之栈的链式存储实现
栈的链式存储也称为链栈,和链表的存储原理一样,都可以通闲散空间来存储元素,用指针来建立各节点之间的逻辑关系。同顺序栈,链表的插入,删除操作也只能在栈顶进行。链栈的C语言实现:(codeblocks完美运行)#include #include typedef struct Node{ int data; //数据域原创 2017-07-10 20:14:14 · 283 阅读 · 0 评论