c++
文章平均质量分 77
lindorx
头疼
展开
-
linux中pingpong测试程序的解读
总代码放在最后。抽象一点讲就是两个球员来回打球,一个发球,一个等待接球,最后计算完成指定数量的来回需要的时间。详细一点:程序定义了几个结构抽象出了pingpong游戏,如下://乒乓游戏的球员typedef struct{ int table; int player; int count; pthread_mutex_t blocks[2]; pthread_t thread;} player_t;//打球的乒乓球台typedef struct{ in原创 2021-02-03 13:45:32 · 2032 阅读 · 0 评论 -
C语言实现的json解析程序
只有一个头文件和一个源文件,仅使用C语言标准库。作用就是读取json文件,然后解析为若干个互相关联的结构,结构如下:typedef enum json_st { djson_string = 1, djson_number, djson_object, djson_array, djson_bool, djson_null}json_st;struct js {//json字符串 //环链 void* next; json_st nexttype; void* prev;原创 2020-06-23 21:23:43 · 3622 阅读 · 0 评论 -
一个简单的文件系统
此文件系统暂时命名为lxfs。使用B+树作为管理结构,但是为了可以容纳更多信息,做了一定的修改。下面是传统的B+树,信息全部保存在叶结点中,通过内部节点进行索引,每一个父级节点的元素索引一个叶节点。...原创 2020-05-01 04:35:02 · 1588 阅读 · 0 评论 -
x86CPU中TSS
TSS为intel为了方便操作系统管理进程而加入的一种结构,用法也很简单。TSS是一个段,即一块内存,这里保存要切换的进程的cpu信息,包括各种寄存器的值、局部描述表ldt的段选择子等,切换时cpu会将这段内容存进各自对应的寄存器,然后就完成了切换。(任务切换或者说CPU状态更新实质上就是改变各个寄存器的值)//32位TSS段结构struct TSS32{ int backlin...原创 2020-04-08 00:39:03 · 1301 阅读 · 0 评论 -
尝试做一个简单的文件系统
使用B+树作为文件系统的主要数据结构,用来储存文件描述符,文件描述符用来储存文件的具体信息(在磁盘上的位置,大小,时间等)。文件描述符参考了FAT32中用来描述文件信息的结构,但有较大的区别。每个文件描述符32占用字节,分为两种:用于描述符文件信息的描述符和用于储存文件名的描述符,两种结构以及相关结构如下://文件属性typedef struct { byte dpl : 2;...原创 2020-01-17 16:17:19 · 811 阅读 · 0 评论 -
GNU-make 传递命令给子makefile
例如主makefile中由clean目标,如果想要通过make clean执行子目录中makefile的cle,可以这样写#假设子目录为test,在test目录里的makefile由cle目标clean: cd test && make cle这样可以执行子makefile的任意指定目标。(注,网上有一些文章说使用";",但是测试后并不行,应该是"&...原创 2019-12-25 10:44:26 · 561 阅读 · 0 评论 -
windows下使用make的一些方法(不定期更新)
在windows下可以使用MinGW的make,安装方法网上有很多,不做阐述,一些按照linux下编写makefile可能会在Windows下出错,以下为我遇到一些可以用来解决的方法:1.process_begin: CreateProcess(NULL, pwd, ...) failed.显示这条一般是在makefile中使用了"$(shell pwd)",但是shell是linux...原创 2019-12-25 10:31:17 · 4191 阅读 · 0 评论 -
C语言使用MCI接口播放声音
2017-12-5 20:58代码如下:#include<iostream>#include<windows.h>#include<Mmsystem.h>#pragma comment(lib,"winmm.lib")using namespace std;void main(){mciSendString(L"ope...原创 2019-12-18 02:27:50 · 1077 阅读 · 0 评论 -
如何让gcc编译中断函数
在x86中,一般函数通过"call"指令调用,"ret"指令返回,但是中断函数不同,它在中断或者异常发生时自动切入(或者使用"int"指令),此时cpu会向栈中压入一堆寄存器来保护现场,如果是异常,还会多压一个错误代码,因此编写中断函数返回时要使用"iret"指令,但是gcc默认是无法编译出iret指令的。当然,有一些IDE自定义了一些东西可以用来编译中断函数,也有一些人会直接用内联汇编解决,但用...原创 2019-12-18 02:19:22 · 2234 阅读 · 0 评论 -
使用python写的gcc下载脚本
本脚本通过访问http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-9/来获取要下载的内容。目前只能在上面的网址下载gcc-9的deb包,可以下载指定Ubuntu版本和架构的gcc9组包。如果你无法通过apt-get更新gcc,可以尝试用此脚本下载包,然后在终端进入下载目录,使用"sudo a...原创 2019-12-17 11:07:01 · 350 阅读 · 0 评论 -
C语言编程时可能会发生的错误(不定时更新)
VS提示"CL.exe已退出,代码为2",检查是否有函数没有写返回值。某个文件内的全局变量不要放在它的头文件中,不然在主文件调用时会引发重定义错误。定义结构体对齐时,#pragma pack(n)和#pragma pack()要成对使用,将结构放在它们中间,n取值为1,2,4,8GCC:如果出现下面的错误,说明内联汇编出错,如果内联汇编没有添加约束(即没有使用“:”),则寄存器...原创 2019-12-16 02:08:22 · 375 阅读 · 0 评论 -
基数树的简单实现-二
对之前的基数树做了修改,减少空间占用。头文件:#pragma once#include<stdlib.h>#include<stdio.h>#define MEMPAGE 4096#define INIT_POOL_SIZE (MEMPAGE*1) //初始内存池大小#define RADIX_INSERT_VALUE_OCCUPY -1 //该节点...原创 2019-12-13 01:11:13 · 360 阅读 · 0 评论 -
在C语言中如何访问堆栈
堆栈一般是用来保存变量之类的东西(静态变量在内存中,虽然堆栈就是内存的一部分,但为了防止歧义,还是分成两部分来说),一般情况下没必要去故意读取堆栈的值,变量用变量名就可以直接访问,但我曾经想要读取函数返回后代码继续执行的地址,因此想到了来读取堆栈(函数调用时,会向堆栈中压入参数和下一个代码执行的地址,这样就可以在函数返回后继续执行)。先来测试一下我们能否读取堆栈(或者说数组越界访问会怎么样):...原创 2019-07-12 10:01:29 · 2955 阅读 · 2 评论 -
C语言函数库查询系统(ACCESS)
这个主要使用ACCESS来进行制作,可以将C语言的函数、全局变量、宏、联合、结构、枚举等类型的字符串分类储存起来,能使用窗体查询这里里面的函数或者宏,也可以用来查看某个函数属于哪个头文件,比如printf()函数:当然,要是人工一个一个的输函数,还不得累死,因此使用VBA制作了简单的程序,可以从语言的头文件或者源文件自动识别出函数、全局变量、结构、宏、联合、枚举等,然后添加到表中,不过技术...原创 2019-07-04 10:51:42 · 4472 阅读 · 0 评论 -
C/C++文件操作
第一种方法: 使用fstresm头文件(sream的子类): 一.打开文件 以“读/写”方式打开文件使用fstream; 以“读”方式打开文件使用ifstream; 以“写”方式打开文件使用ofstream; 打开文件的方式在类ios(是所有流失I/O类的基类)中定义,常用的值如下: ios::app //以追加方式打开文件 ios::ate //文件打开后定位到文件尾,ios::a原创 2017-12-09 03:04:11 · 347 阅读 · 0 评论 -
mciSendCommand函数使用
函数原型: MCIERROR mciSendCommand( MCIDEVICEID wIDDevice, UINT uMsg, DWORD fdwCommand, DWORD dwParam ); //若成功则返回0,否则返回错误码wIDDevice 设备的ID,在打开设备时不用该参数 uMsg命令 消息 fdwCommand命令 消息的标志 dwParam 指向包含命令原创 2017-12-09 13:18:37 · 2751 阅读 · 5 评论 -
C/C++获取键盘事件
在vs中可以使用_kbhit()函数来获取键盘事件,使用时需要加入conio.h头文件,例:#include <conio.h>#include <iostream>using namespace std;int main(){ int ch; while (1){ if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真原创 2017-12-09 17:50:38 · 59510 阅读 · 18 评论 -
c++——使用PlaySound()播放声音
PlaySound是windows中用来播放声音的API函数,函数声明如下: BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound) 其中pszSound用来指定要播放的文件,可以是资源名或者音乐文件的路径,若为空(NULL)则停止正在播放的声音。PlaySound只能播放WAV文件。 hmod一般设置为空(NULL),除非你要原创 2017-12-05 20:30:15 · 51915 阅读 · 64 评论 -
c++学习笔记(部分适用于c语言)
前言:首先,纠正一个可能的认知错误。编程语言并非专指以某种名称命名的语言,而是一类编程规范,或者说语法规则。拿BASIC(初学者通用指令代码)举例, 基于BASIC衍生出了VB、QB等语言,它们统称为BASIC语言,完全适用于BASIC的语法,但由于开发者的目的不同,他们又有各自适合的方面。VB是微软公司开发出的可视化编程语言,可以很容易开发出拥有图形界面的软件。QB也是由微软基于BASI原创 2018-01-13 15:08:40 · 255 阅读 · 0 评论 -
一个小型的汇编编译器
train汇编器本程序包含4个源文件与6个头文件,源文件约2200行代码,头文件共约500行,可识别并编译27项指令。支持vs2013及更高版本支持gcc 6.3.0及更高版本,gcc编译过程如图:(2019.7.26更新,直接在终端输入make来编译,编译文件时可以输入"./train.exe 源文件1.asm 源文件2.asm 源文件3.asm ·······",编译后的文件后缀名...原创 2018-04-25 19:09:26 · 9074 阅读 · 7 评论 -
MIT 6.828课程引导部分的解读
引导代码位于boot文件夹下,由一个16位与32位汇编混合的汇编文件(boot.S)和一个C语言文件(main.c)组成。程序的入口在boot.S中,采用的是AT&T语法,下面先对这个文件进行分析:#include <inc/mmu.h>在inc文件夹下有一个mmu.h头文件,这里存放了一些经常会用到的宏定义.set PROT_MODE_CSEG, 0x8 ...原创 2018-06-05 15:44:23 · 1069 阅读 · 2 评论 -
对于C语言重复包含/重复定义的解决(gcc)
使用条件编译指令例如:a.h:int fun();b.h:#include "a.h"c.h:#include "a.h"main.c:#include "b.h"#include "c.h"......//编译时就会出现重复包含/定义错误可以加入条件编译指令#ifndef #endifa.h:#ifndef A_FUN#define A_FU...原创 2019-04-04 23:07:29 · 10559 阅读 · 2 评论 -
GDT表
gdt表在x86架构中用来存储内存的分段信息,通过段选择子进行访问,表的大小=0x10000=65536字节,每个表项占8字节,第一个表项为空,不使用,因此一共有8191个可用表项。表项结构如下(图片来自https://blog.csdn.net/yeruby/article/details/39718119)其中段限长决定了这个段的大小,总共占用20bit,最小单位由G位决定,...原创 2019-04-20 00:35:47 · 9845 阅读 · 0 评论 -
使用OpenGL生成一个简单的莫比乌斯环
生成的结果如下,初学者,只是使用了一些基础的函数:代码如下:#include<iostream>#include<math.h>using namespace std;#include<gl/glut.h>//莫比乌斯环坐标生成宏#define MobiusX(u,v) ((1+(v)*cos((u)/2)/2)*cos(u))#d...原创 2019-05-18 02:45:33 · 881 阅读 · 0 评论 -
使用OpenGL的简单语句来制作一个简单的计算器-加减乘除
OpenGL采用glut,虽然版本太老了,但是容易入门。计算器很粗糙,但已经可以实现比较小的数字加减乘除。IDE使用VS2019.效果如下:只需要在调用main()中调用calculator()就可以了,头文件和源文件在下面:#include"calculator.h"int main(int argc,char * argv[]){ calculat...原创 2019-05-18 02:55:38 · 881 阅读 · 0 评论 -
位图(.bmp)文件结构
bmp位图主要分为4部分,文件头、信息头、调色板(24位位图和32位位图没有调色板)、图像数据区。 文件头定义如下:typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为“BM” ,16进制为0x424D。占2字节DWORD bfSize; // 位图文件的大小,以字节为单位 ;占4字节WORD bfReserved原创 2017-12-08 22:10:05 · 1082 阅读 · 0 评论