自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 MSVC中常见的几种函数调用约定

MSVC中几种常用的函数调用约定1. calling convention1.1 cdecl参数从右向左压入堆栈调用方清理堆栈名称修饰:函数名加前缀_1.2 stdcall参数从右向左压入堆栈被调用方清理堆栈名称修饰:函数名前缀加_,后缀@,之后接参数列表字节数1.3 fastcall前两个小于等于DWORD的参数通过ECX, EDX寄存器传递,其他参数从右向左依次压入堆栈被调用方清理堆栈名称修饰:函数名前缀加@,后缀@,之后接参数列表字节数2. prologue a

2022-04-15 16:09:41 1036

原创 Ruby Enumerable 模块中的方法——分组,查找和过滤

Ruby Enumerable 模块中的方法——分组,查找和过滤1. Groups, slices, and partitions:1.1 group_by​ 该方法返回一个哈希对象,哈希的key是block的返回值,哈希的value则是block给出相同值的一组元素的数组,相当与对self中的元素进行了一个分组。如果调用该方法时没有给出block,则返回一个Enumerator。group_by {|element| ...}group_by1.2 partition​ partitio

2022-04-11 19:24:47 428

原创 Ruby Enumerable 模块中的方法——查询和选取

Ruby Enumerable 模块中的方法——查询和选取1. 用于查询的方法这一类方法从对象查询并获取信息,而不是直接获取对象的元素1.1 include?include?(object)如果self中存在元素element,使得element==object,则该方法返回true1.2 member?member?(object)member?是include?的别名,用法同上1.3 all?all?没有参数也没有块,此时判断self中是不是每个元素都为tr

2022-04-11 12:55:40 635

原创 C#调用C/C++创建的非托管动态库

C#调用C/C++创建的非托管动态库基本用法C#可以调用由C/C++语言创建的非托管动态链接库,这需要用到 [DllImport("xxx.dll")] ,根据msdn上的解释,**DllImport注解(Attribute)**用于指定一个非托管的动态链接库的导出函数为静态入口点。下面引用一个官方的例子来说明该注解的用法:using System;using System.Runtime.InteropServices;class Example{ // Use DllImport

2021-03-14 21:57:27 495

原创 动态链接库的创建和使用

动态链接库的创建和使用一. 创建动态链接库1. 创建动态链接库项目1. 1 动态链接库(DLL)项目结构如下为了节约大型项目的编译时间,系统自动为我们生成了和预编译头相关两个文件pch.cpp和pch.h,我们可以选择保留或者是删除他们。如果决定保留则需要在项目中每个源文件的最前面加入#include "pch.h",否则无法通过编译。如果删除了他们,同时还需要到项目属性中禁用预编译头,具体方法如下:dllmain.cpp定义了动态库的入口,当系统开始或终止一个进程或线程的时候,会调用每个

2021-03-14 20:58:50 2138

原创 通过powershell给文件批量添加后缀

再不一个powershell版本的echo "批量添加后缀"$suffix = Read-Host "输入后缀:"foreach($file in Get-ChildItem){ if($file.Name -eq "rename.ps1") { echo "File ignored: $file" }else { echo "Processing file: $file" Rename-Item $file -NewN

2020-11-01 00:52:24 1416

原创 利用批处理批量修改文件后缀

利用批处理批量修改文件后缀学业繁忙,距离上一篇已经过去好久了,sad今天刚好要在旧机器上批量修改数据文件的后缀,所以更一些奇怪而又没什么用的东西:@echo offREM echo %~nx0set "suffix=.txt"for %%f in (*) do ( if "%%~nxf" == "%~nx0" ( echo -^> File ignored: %%~nxf ) else ( echo -^> Processing file: %%~nxf ren "

2020-10-30 23:53:53 514

原创 结构体的内存布局

结构体的内存布局为了提高内存访问效率,降低处理器从内存读取数据的开支,各种数据类型的对象并不是连续存放在内存中的任意起始地址上的,而是尽可能的对齐到机器字长上面。编译器出于优化的考虑,会给各种数据类型的变量在内存的存储方式施加限制,我们可以从两个方面来考虑这个问题,一个是对齐(alignment),另一个就是间距(padding)。1. 对齐各个变量在内存中的起始地址能够被变量所属类型的宽度所整除。比如说占据2个字节的 short 类型的地址应该是偶数,占据4个字节的 int 和 float 应该放到

2020-05-28 10:46:04 1273

原创 Win32 API (4) CreateProcess

CreateProcessCreateProcess 是一个宏,根据是否定义符号常量 UNICODE 展开为 ASCII 和 UNICODE 两个版本,其实如果不是必须更推荐使用 UNICODE 版本的 API 函数,因为即便是 ASCII 版本的函数,内核层面也是通过 UNICODE 版本来实现的。函数原型:// ASCII 版本BOOL CreateProcessA( LPCSTR lpApplicationName, LPSTR

2020-05-15 11:02:26 757

原创 Win32 API (3) ZeroMemory,SecureZeroMemory

ZeroMemoryZeroMemory 是一个宏,不是函数,它的定义如下:#define ZeroMemory RtlZeroMemory#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))我们发现,这个 ZeroMemory 是 RtlZeroMemory 的宏定义,而 RtlZeroMemory 是一个有参宏,最终是通过调用C标准库函数 memset 来实现的。下面为了方便,我们还是以函数原型的

2020-05-15 10:59:58 890

原创 Win32 API (2) lstrlen

lstrlen像很多和字符串有关的 Windows API 一样,lstrlen 是一个宏,有 ASCII 和 UNICODE 两个版本:#ifdef UNICODE#define lstrlen lstrlenW#else#define lstrlen lstrlenA函数原型:int lstrlenA( LPCSTR lpString);int lstrlenW( LPCWSTR lpString);函数原型除掉参数类型略有差异以外,其他都是完全一致的。该函数计算

2020-05-13 21:09:45 691 2

原创 Win32 API (1) WinExec

WinExec函数原型如下:UINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow);该函数用于运行一个指定的应用程序,现在已经淘汰,仅用于保持对16位Windows操作系统的兼容,可以使用函数 CreateProcess 来代替。参数说明:lpCmdLine :运行程序所需的命令行参数(文件名+可选参数),若该参数中没有包含可执行文件的路径,将会自动按照下面顺序搜索可执行文件:应用程序被加载的目录当前目录Windows系统目录,该目录可

2020-05-12 11:11:10 762

原创 进位标志和溢出标志的含义和理解

进位标志和溢出标志这次大概总结一下进位标志(Carry Flag, CF)和溢出标志(Overflow Flag, OF)的含义和理解方式首先明确一点基本认识,处理器本身并不在意也不知道参与算术运算或者逻辑运算的操作数是有符号的还是无符号的。ALU总是为给定的操作数做二进制运算,并根据结果设置相应的标志位。因此,视参与运算的整数的实际情况,CF或者OF会被独立的置位或者清零。他们的含义是有程...

2020-05-05 19:23:59 25187 2

原创 通过虚拟机实现裸机汇编环境

通过虚拟机实现裸机汇编环境1. 简述操作系统带来便利的同时也引入了大量限制,在操作系统存在时,我们编写的程序不能直接被硬件加载。我们必须按照操作系统的约定,把程序编译成特定的可执行文件格式(比如Windows的PE文件格式,Linux的ELF文件格式)。执行程序时,由操作系统读取可执行文件,选择合适的内存空间,并将代码和数据加载到内存中相应位置,这样程序才能被处理器所执行,在程序执行过程中遇到...

2020-05-01 14:00:29 1728

原创 Intel X86 的内存寻址模式

Intel X86 的内存寻址模式1. 直接寻址(Direct memory addressing mode)通过立即数直接指定偏移地址,段地址隐含在指令中,当然也可以人为指定段寄存器。MOV EAX, [0X8FFCBC]MOV EAX, DWORD PTR DS:[0X8FFCBC]2. 寄存器间接寻址(Register based indirect addressing mode...

2020-04-30 12:46:12 897

原创 "const wchar_t *" 类型的实参与 "LPCSTR" 类型的形参不兼容的原因和解决方法

常见字符类型宽字符串字面量L"Wide string literal"属于const wchar_t*,采用UNICODE编码,标准C类型。字符串字面量"string literal"属于const char*,采用ANSI编码,标准C类型。typedef wchar_t WCHAR,定义于winnt.h,是windows扩展的类型别名。typedef char TCHAR 和typed...

2020-04-19 22:36:57 12865

原创 Maven的基本配置方法

Maven的基本配置方法基本概念曾经碰到过很多需要使用Maven的场合,不过由于认为Maven仅仅是一个工具并且自己也没有多少时间的原因(好像归结起来还是懒),一直都没有去认真了解过它。每次都是能绕过去就绕过去,绕不过去就面向搜索引擎编程,只要得到结果就没有再考虑什么。然而这样下去,每次使用都会碰到各种各样的问题,所以打算稍稍学习整理一下,用几篇文章记录下来供自己之后遗忘的时候查阅。Mave...

2020-03-13 20:32:42 563

原创 C语言通过变量控制输出精度的两种方法

有的时候需要通过用户输入的变量来控制数据的输出宽度,总结了一下,大概有两种办法:1.直接使用转换说明符 *我们都知道可以通过%m.n来控制数据的输出范围,这里要求m和n都是字面量类似地,标准库也提供了通过变量来控制宽度的方法,这时我们就要使用%*.*。当使用*的时候要求通过一个int类型的参数来指定宽度,如果参数是正数则输出右对齐,如果参数是负数则输出内容左对齐,相当于添加了一个-标签。例子...

2020-03-02 22:32:19 7374

原创 随机迷宫生成与寻路算法(3)深度优先搜索

通过深度优先搜索求解迷宫在上一篇文章中我们实现了基于深度优先搜索(DFS)的随机迷宫生成。方法类似,我们也可以利用DFS来进行随机迷宫寻路,也就是我们这一次文章的实现目标。我们将尝试通过深度优先搜索来求解上一篇文章中生成的随机迷宫,稍有不同的是这次我们通过栈和迭代代替上次使用的函数递归调用,这两种方法理论上来分析是等价的。该方法很容易理解:首先我们将迷宫的起始点入栈将栈顶元素标记为当前...

2020-03-02 19:03:01 650 1

原创 随机迷宫生成与寻路算法(2)深度优先搜索

迷宫生成算法(2)深度优先搜索由于上次的实现中存在着一些问题,因此这次还是使用深度优先搜索,改掉下面这几个问题:显示迷宫时,直接输出数字0和1显得不够直观。递归部分的解释不够严谨,实现也很混乱,这次着重重写了这一部分。实践表明迷宫的尺寸只能是奇数,如果是偶数会出现一行或者一列遍历不到,因此我们检查用户输入,对输入的偶数直接加1。除了这些之外,还修改了一下迷宫类的定义,把和坐标有关的成...

2020-03-01 19:50:33 604

原创 随机迷宫生成与寻路算法(1)深度优先搜索

迷宫生成算法(1)深度优先搜索接下来一段时间,想要研究下随机迷宫生成算法,打算在有空可时候偶尔更新一下这方面的学习过程。随机迷宫的生成算法有很多种,比如递归回溯,递归分割,随机Prime等等。今天是第一次尝试随机迷宫生成,就先试一下用递归的方法通过深度优先搜索来生成随机迷宫。首先我们来明确一下基本观念,迷宫可以通过一个二维数组来表示,二维数组中的元素就表示存在于迷宫中的位置,他们可能是可以行走...

2020-03-01 01:08:19 1616

原创 C++ Primer习题解答 Chapter12

12-30要实现的功能:从文件读入文本,并保存以用于查找给读入的文本建立一个从单词到其出现的全部行号的映射读取用户输入的单词,查找该单词是否出现过,如果出现过打印出所在行和行号根据上面列出来的基本需求,决定应该使用哪些数据结构:首先我们需要一个容器来保存从文件中读取的文本,考虑到查找是以行为单位进行的,因此文本逐行保存,我们不妨用一个vector<string>来保...

2020-02-28 18:36:18 146

原创 C++ Primer习题解答 Chapter11

11-3#include<iostream>#include<vector>#include<string>#include<cctype>#include<iterator>#include<stdexcept>#include<map>#include<cctype>#includ...

2020-02-26 23:26:12 340

原创 C++ Primer习题解答 Chapter10

10-1#include<iostream>#include<vector>#include<string>#include<cctype>#include<iterator>#include<stdexcept>#include<algorithm>#include<fstream>...

2020-02-24 23:22:10 383

原创 通过C++求解中缀表达式

中缀表达式求值1.概述:在C++ Primer(5th)的第九章顺序容器中出现了下面一道习题:作为栈适配器的练习,这个题目看上去很复杂(emmmm。。。刚开始看了好几遍都没太懂题目要干什么)。有些疑惑地我又看了看对应的英文版,意思完全不一样好不好。。。现在这个题目就很简单了,就是通过栈把被左右圆括号括起来的内容替换掉,没有什么太多需要注意的地方,实现代码如下:#include<...

2020-02-23 14:21:34 1118

原创 C++ Primer习题解答 Chapter9

9-5#include<iostream>#include<vector>#include<string>#include<cctype>#include<iterator>#include<stdexcept>using namespace std;vector<int>::iterator ...

2020-02-22 17:05:30 173

原创 初始化list容器时遇到的错误

初始化list<char*>遇到的错误记录一个今天写C++遇到的一个错误,代码是这样的:list<char *> list = { "hello", "world" };vector<string> v;v.assign(list.begin(), list.end());编写过程中做的类型检查并没有提示任何错误,一眼看过去也没什么问题,但是并不能通...

2020-02-21 23:59:16 1484 1

原创 C++ Primer习题解答 Chapter8

8-1#include<iostream>#include<vector>#include<string>#include<cctype>#include<iterator>#include<stdexcept>using namespace std;istream& readStream(istr...

2020-02-21 15:25:10 178

原创 C++ Primer习题解答 Chapter7

本章习题大多相互承接,最终实现一个比较完整地类,鉴于这样的特点,这里不再贴出每一个练习的代码,而是挑选几个类列出其最终实现:1.Sales_data类//Sales_data.h#include<string>using namespace std;class Sales_data;//友元函数的类外声明istream& read(istream &i...

2020-02-20 20:14:30 156

原创 C++ Primer习题解答 Chapter6

6-3#include<iostream>//#include<vector>//#include<string>//#include<cctype>//#include<iterator>//#include<stdexcept>using namespace std;int fact(int d);...

2020-02-18 21:52:50 194

原创 遍历二维数组的三类方法(C++)

遍历二维数组的三种方式1.下标法for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { cout << array[i][j]<<'\t'; } cout << endl;}2.指针法for (int(*prow)[column] = arra...

2020-02-18 00:15:24 3084

原创 C++ Primer习题解答 Chapter 5

5-5#include<iostream>#include<string>using namespace std;int main(){ string table[] = { "F", "D", "C", "B", "A", "A++"}; int grade; string level; cout << "please input your...

2020-02-17 19:30:30 468

原创 C++ Primer习题解答 Chapter 4

4-21#include<iostream>#include<vector>using namespace std;int main(){ vector<int> vint; const int sz = 100; cout << "原向量:" << endl; for (int i = 0; i < sz; i...

2020-02-16 20:11:53 109

原创 C++ Primer习题解答 Chapter 3

3-2#include<iostream>#include<string>using namespace std;int main(){ int option; while (cout<<"1 读入整行\n2 读入单词\n", cin >> option) { if (option == 1) { string s; ...

2020-02-15 20:16:20 474

原创 Qt5学习笔记基础篇(3)Qt中的字符串操作

Qt中的字符串操作3.1 概述对于一个应用程序来说,文本操作几乎是无处不在的,无论是窗体应用还是控制台应用都难免要做诸如显示,输入,处理文本之类的操作。因此字符串作为文本的载体也就必不可少,大多数编程语言都直接或者间接的提供了字符串类型以方便我们操作字符串,比如C++标准库提供的字符串类std::string。Qt作为一个跨平台开发框架实现了自己的字符串类型QString,该类型广泛应用于Qt...

2020-02-14 14:10:27 2971

原创 C++ Primer习题解答 Chapter 2

2-1(1)short, int, long, long long 的区别:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07JKbSR7-1581597379848)(img/2/1.png)]并且标准还要求这些类型满足:1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(...

2020-02-13 20:37:10 272

原创 C++ Primer习题解答 Chapter 1

1-2int main(){ //main返回值用来指示状态,0表示成功,其他由系统定义,通常表示错误 return -1; }1-3#include<iostream>int main(){ std::cout << "Hello, World!" << std::endl;}1-4#include<iostream&gt...

2020-02-12 22:58:35 117

原创 Qt5学习笔记基础篇(2)信号和槽

信号和槽2.1 概述在GUI应用程序中,经常会有这样的需要,当一个组件的状态发生变化时其他组件要对此做出响应,比如单击关闭按钮后主程序要退出,文本框内容发生改变时提交按钮才生效,进度条要随着示数同步变化等等。为了实现这种对象之间的通信功能,不同的开发框架有不同的处理方式。在基于回调函数(callback)的框架中,我们把回调函数的指针传递给调用者,这样就可以在事件发生时通过指针找到回调函数并完...

2020-02-12 11:13:21 603

原创 Qt5学习笔记基础篇(1)创建第一个Qt应用程序

创建第一个Qt应用初次接触Qt,安装之后发现他的官方文档内容详实,条理清晰,并且集成在开发工具Qt Creator之中,阅读非常方便。因此决定学习初期直接参阅官方文档,而这个系列的文章则是学习过程的一个记录。1.1 Qt概述Qt是一个同时支持桌面,嵌入式,移动端的跨平台应用程序开发框架,在Linux,Windows,OS X,iOS,Android等操作系统上都可以运行。Qt本身并不是一个...

2020-02-09 22:08:58 1169

原创 Window应用程序(C/C++)(3) MFC程序的基本框架

MFC程序的基本框架3.1 MFC项目的类框架建立Single document MFC应用程序,向导会为我们自动生成代码,其中有五个重要的类需要注意:CAboutDlg(派生自CDialog)CMainFrame(派生自CFrameWnd)CTestAPP(派生自CWinApp):应用程序类CTestDoc(派生自CDocument)CTestView(派生自CView)这五...

2020-02-08 14:22:49 487

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除