char

《游戏编程模式》(3)

隐身守侯 提交于 2020-03-07 08:22:35
Chatper 5 原型模式 核心思想是一个对象可以生成与自身相似的其他对象。 基类Monster,有一个抽象方法clone: 1 class Monster 2 { 3 public: 4 5 virtual ~Monster() {} 6 virtual Monster* clone() = 0; 7 8 // Other stuff... 9 }; 子类的clone实现: 1 class Ghost : public Monster { 2 public: 3 4 Ghost(int health, int speed) 5 : health_(health), 6 speed_(speed) 7 {} 8 9 virtual Monster* clone() 10 { 11 return new Ghost(health_, speed_); 12 } 13 14 private: 15 int health_; 16 int speed_; 17 }; 通用的Spawner类: 1 class Spawner 2 { 3 4 public: 5 Spawner(Monster* prototype) 6 : prototype_(prototype) 7 {} 8 9 Monster* spawnMonster() 10 { 11 return prototype_-

c/c++ 函数指针的用法

戏子无情 提交于 2020-03-07 07:02:16
【目录】 基本定义 c 函数指针使用举例 c++ 函数指针使用举例 函数指针作为函数参数 函数指针作为函数返回值 函数指针数组 typedef 简化函数指针操作 c语言函数指针的定义形式: 返回类型 (* 函数指针名称 )( 参数类型 , 参数类型 , 参数类型, …); c++函数指针的定义形式 : 返回类型 (类名称 ::* 函数成员名称)(参数类型,参数类型,参数类型, ….); 以下代码编译环境:codeblocks with gcc in win 7 c语言函数指针使用举例: #include <stdio.h> #include <stdlib.h> int fun1() { printf("this is fun1 call\n"); return 1; } void fun2(int k, char c) { printf("this is fun2 call:%d %c\n", k, c); } int main() { int (*pfun1)() = NULL; void (*pfun2)(int, char) = NULL; int a,b; pfun1 = fun1; //第一种赋值方法 a = pfun1(); //第一种调用方法(推荐) printf("%d\n",a); b = (*pfun1)();//第二种调用方法 printf("%d\n",b

进程间通信(管道、共享内存、消息队列、信号量)

随声附和 提交于 2020-03-07 04:59:20
进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间考到内核缓存区,进程2再内核缓存区把数据读走,内核提供这种机制称为进程间通信。通信方式有:管道、共享内存、消息对列、信号量等 管道 什么是管道呢? 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是内核中的一块缓冲区。 管道的特性 ① 半双工通信 :半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。 ②: 管道的生命周期随进程 ,进程关闭,对应的管道端口关闭,两个进程都关闭,则管道关闭。 ③: 管道自带同步与互斥 :管道为空时读取,read 阻塞;管道满时写入,write 阻塞。 ④: 管道提供字节流传输服务 管道的分类 ①:匿名管道 ②:命名管道 匿名管道 什么是匿名管道? 匿名管道之所以可以通信的本质在于,父进程frok子进程,父子进程各自拥有一个文件描述符表

C++ 中的 sizeof()

你说的曾经没有我的故事 提交于 2020-03-07 04:07:02
【牛客题目1】在Visual C++ 和 Mingw64平台上,short a[100], sizeof(a) 返回什么? A. 2 B. 4 C. 100 D. 200 E. 400 答案:D Reference: https://www.nowcoder.com/test/question/done?tid=31013888&qid=1490#summary 解析:short int: 2个字节 【1.1】 sizeof 返回的数值表示的含义如下(单位字节) 数组 - 编译时分配的数组空间大小 【1.1】(特别地,若数组作为参数被传入函数中做sizeof()运算,则和指针运算没区别)【1.2】 指针 - 存储该指针所用的空间大小 (存储该指针的地址长度,是长整型,应该为4) 【2】 类型 - 该类型所占用的空间大小 【3】 对象 - 对象的实际占用空间大小 【4】 函数 - 函数的返回类型所占的空间大小。函数的返回类型不能是void【5】 【题目2-13】 1 char str[] = "Hello"; 2 char *p = str; 3 int n = 10; 4 sizeof(str) = 6; // H,e,l,l,o,\0 [1.1] 5 sizeof(p) = 4; // [2] 6 sizeof(n) = 4; // [3] 7 void Func(char

C语言代码优化示例(一)

隐身守侯 提交于 2020-03-07 03:55:37
在实际产品的软件开发过程中,很多时候会对代码的性能提出要求,追求最快的速度,提高程序运行效率,改善用户体验等,此时此刻,对代码的优化就非常有必要了,掌握代码的优化方法和技巧就很有必要了。 我们用下面的一段短小的代码为例,来看看优化的过程,并且简略分析一下起优化的原理。 这段代码在CRC的校验中有机会用到,功能是将一个字节的数据逐位的颠倒反转。 //功能: 将数据的位反转,即b0->b7,b1->b6...b7->b0 //des: 转换后的目标buffer //src: 源数据 //len: 数据长度 void Invert8 ( unsigned char * des , unsigned char * src , unsigned int len ) { unsigned char i , j , temp ; for ( j = 0 ; j < len ; j ++ ) { temp = 0 ; for ( i = 0 ; i < 8 ; i ++ ) { if ( ( * src ) & ( 1 << i ) ) temp | = 1 << ( 7 - i ) ; } * des = temp ; des ++ ; src ++ ; } } 我们先第一遍运行,看看这个常规写法的运行时间是多少(CPU速度72MHz) 调用:Invert8(dst,src,100);

【Transact-SQL】教材3.5“数据更新”的几道例题(INSERT-DELETE-UPDATE)

耗尽温柔 提交于 2020-03-07 03:33:28
在“更新数据”语句的前后,适当增加简单的查询语句,便于查看更新的效果。 下面这句查询的意思是:查看Student表的全部数据。 SELECT * FROM Student 【例3.72】-P115 --第一步:建表 CREATE TABLE Dept_age ( Sdept CHAR(15), /*系名*/ Avg_age SMALLINT /*学生平均年龄*/ ); --第二步:插入数据 INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept; --第三步:查看数据 SELECT * FROM Dept_age 【例3.73】-P115 SELECT * FROM Student UPDATE Student SET Sage=22 WHERE Sno='201215121'; SELECT * FROM Student 【例3.74】-P115 SELECT * FROM Student UPDATE Student SET Sage= Sage+1; SELECT * FROM Student 【例3.75】-P116 SELECT * FROM SC UPDATE SC SET Grade=1 WHERE Sno IN ( SELECT Sno FROM

pat乙级

﹥>﹥吖頭↗ 提交于 2020-03-07 02:07:12
1081. 检查密码 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点".",还必须既有字母也有数字。 输入格式: 输入第一行给出一个正整数 N(<=100),随后 N 行,每行给出一个用户设置的密码,为不超过80个字符的非空字符串,以回车结束。 输出格式: 对每个用户的密码,在一行中输出系统反馈信息,分以下5种: 如果密码合法,输出“Your password is wan mei.”; 如果密码太短,不论合法与否,都输出“Your password is tai duan le.”; 如果密码长度合法,但存在不合法字符,则输出“Your password is tai luan le.”; 如果密码长度合法,但只有字母没有数字,则输出“Your password needs shu zi.”; 如果密码长度合法,但只有数字没有字母,则输出“Your password needs zi mu.”。 输入样例: 5 123s zheshi.wodepw 1234.5678 WanMei23333 pass*word.6 输出样例: Your

c++ string转char* char字符数组转字符串 push_back使用方法

别说谁变了你拦得住时间么 提交于 2020-03-06 16:40:36
c++ string转char* 1、如果要将string转换为char*,可以使用string提供的函数c_str() ,或是函数data(),data除了返回字符串内容外,不附加结束符'\0',而c_str()返回一个以‘\0’结尾的字符数组。 2、const char *c_str(); c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式. 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样: char* c; string s="1234"; c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理 应该这样用: char c[20]; string s="1234"; strcpy(c,s.c_str()); 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: string s = "Hello World!"; printf("%s",s.c_str()); /

语言中结构体变量和结构体类型的定义

让人想犯罪 __ 提交于 2020-03-06 13:43:49
1. 结构体类型定义 定义方式1 : Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; Typedef struct LNode *LinkList; 以上两个定义方式是等价的,是将*LinkList 定义为struct LNode 类型,即LinkList 被定义为一个类型名。这样就可以用LinkList 来定义说明新的变量了,如: LinkList L ; 即将L 定义为struct LNode 类型的指针变量 2. 结构体类型变量定义 定义方式1 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }LnodeA ; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; struct LNode LnodeA ; 以上两个定义方式也是等价的,这样就将LnodeA 定义为一个truct LNode 类型的变量,即LnodeA 为一个truct LNode 类型的变量名。

junit5中Assertions替代了Assert

若如初见. 提交于 2020-03-06 10:24:14
最近基于Spring Boot2.x版本中的JUnit5进行单元测试,发现Assert类已经不存在了,在JUnit5中使用Assertions进行替代。而且Junit5不仅仅替代了这么一个类,还有其他大量的类被重新定义和替换,在使用的时候大家需要留意。 同时Assertions中也提供了更多的方法,相关源码实现如下: @ API ( status = Status . STABLE , since = "5.0" ) public class Assertions { @ API ( status = Status . STABLE , since = "5.3" ) protected Assertions ( ) { } public static < V > V fail ( ) { AssertionUtils . fail ( ) ; return null ; } public static < V > V fail ( String message ) { AssertionUtils . fail ( message ) ; return null ; } public static < V > V fail ( String message , Throwable cause ) { AssertionUtils . fail ( message , cause