int a; int* a; int** a; int (*a)[]; int (*a)(int)

a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间; d) int (*a)[4];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。 以上四种类型见上图表示。 e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。 重点: int *p[]和int (*p)[] 前者是指针数组,后者是指向数组的指针。更详细地说。 前: 指针数组;是一个元素全为指针的数组. 后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看......) int*p[4]------p是一个指针数组,每一个指向一个int型的 int (*q)[4]---------q是一个指针,指向int[4]的数组。 定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。 首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便) 再看int (*q)[4]。它首先是个指针,即*q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下: 请看以下定义: int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4]; q=a; *p=c; *(p+1)=d; 则int *p[4]和int (*q)[4]的存储数据为: 验证: #include <stdio.h> int main(void) { int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4];

java经典问题(一)

问题: 1、介绍你做过的项目中遇到的难点以及你是如何解决的。 2、java中有指针吗? 3、java的垃圾回收机制 4、用过什么框架 5、数据库防守、注入的常用手段 6、list、map 7、arraylist和linkedlist数据结构的区别 8、介绍一下堆排序 9、最近在读哪些书? 10、linux文件系统分为几种? 11、如何对linux文件进行更改权限的操作 12、java中异常的分类,outofmemory异常是在什么情况下产生的? 13、Java中的可以指定进行内存回收吗(垃圾回收机制方面的问题) 其实电话面试并不难,主要是问一些基础性的东西。电面官有点严肃,有点给人心理压力。 14、arraylist的长度是多少? 我的回答以及后期的修正(当时回答的特别差劲,现在的答案是后来思考和查找了一些资料): 1、根据个人的项目经验而异,这个大多数面试中都会被问到。 2、Java中不存在指针,C、 C++中有,这是Java和C、C++的区别。C和C++的区别在于他们解决问题的思想不一样。C++是设计这个概念被融入到C++之中,而对于C,更注重的是算法。Java中对于指针进行伪装,概念上弱化和淡化,实际上是有的。 3、对于Java中的垃圾回收机制并没有过多的了解,只知道Java是会自动回收垃圾的,而且回收垃圾对于程序员而言是不可见的,无法预知垃圾回收是否完成。 4、过去所做的项目中几乎都没怎么用框架,之后要开始学习框架的使用。比较熟悉的可能就是MVC设计模式了。 model(模型层)、view(视图层)、controller(控制层) 5、要了解数据库防守,就得对注入有一定的了解。数据库注入的常用手段有,URL地址注入、表单注入和使用注入工具等等。 防守:黑白名单验证、表单验证以及权限控制。 6、list和map的区别。map是键值对的映射,都是属于Java的集合类。 7、arraylist的是使用数组存储 而linkedlist使用的是链表存储。他们存储方式的不同也就导致了他们在插入、查找的时候的效率也不同。 8、堆排序 这是常识了 9、鸟哥的Linux私房菜(答此题要慎重,后面一连串关于Linux的问题由此而来,可是我才看这本书不久) 10、不懂 11、chmod 12、一共分为两大类。所有的异常都继承自java.lang.Throwable类 Throwable有两个直接子类。error和exception 13、当时回答不可以,后来查资料知道是可以的。

[进阶]-Python3 异步编程详解(史上最全篇)

目录 1 什么是异步编程 1.1 阻塞 1.2 非阻塞 1.3 同步 1.4 异步 1.5 并发 1.6 并行 1.7 概念总结 1.8 异步编程 1.9 异步之难(nán) 2 苦心异步为哪般 2.1 CPU的时间观 2.2 面临的问题 2.3 解决方案 3 异步I/O进化之路 3.1 同步阻塞方式 3.2 改进方式:多进程 3.3 继续改进:多线程 3.4 非阻塞方式 3.5 非阻塞改进 3.5.1 epoll 3.5.2 回调(Callback) 3.5.3 事件循环(Event Loop) 3.5.4 总结 4 Python 对异步I/O的优化之路 4.1 回调之痛,以终为始 4.2 核心问题 4.3 协程 4.4 基于生成器的协程 4.4.1 未来对象(Future) 4.4.2 重构 Crawler 4.4.3 任务对象(Task) 4.4.4 事件循环(Event Loop)驱动协程运行

Java位运算总结

这是自己4年前的Java学习笔记,现发布在ITEye留作纪念,同时也希望对那些刚刚接触Java的童鞋们有些许帮助。 情如痕,缘似印,奈何情深缘浅海誓山盟空对月,流尽痴泪只为你我心再近,踏破情路惟愿红尘有你。 ---------清晨随感 前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力。今天系统研究了下,现记录如下。 首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作。主要包括位与、位或、位非,有符号左移、有符号右移,无符号右移等等。需要注意一点的是,不存在无符号左移<<<运算符。根据位运算的概念规定,我们首先需要弄明白两个问题,java有哪些数据类型是整型数据类型和各数字进制之间转换问题。Java整型数据类型有:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占几个字节。我们都知道,一个字节占8位。 数据类型 所占位数 byte 8 boolean 8 short 16 int 32 long 64 float 32 double 64 char 16 还需要明白一点的是:计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负 所以比如-4用二进制原码表示就是1111 1111 1111 1111 1111 1111 1111 1100 下面根据实例一个一个的来说明各种位运算的运算规则: 位与&(真真为真 真假为假 假假为假) 4&6 0000 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 0000 0110 0000 0000 0000 0000 0000 0000 0000 0100 结果:4 位或|(真真为真 真假为真 假假为假) 4|6 0000 0000 0000 0000 0000 0000 0000 0100

Win7x64系统过TP的一些尝试和目前遇到的问题

其实渣新学内核编程不过半个月时间,帖中难免有幼稚的想法和错误,遇到的问题我会用蓝色文字表述,还请各位前辈指正,感激不尽! 我把自己目前的进展和遇到的问题一起说说吧: x64系统过TP大概分两步,首先要过双机调试,然后要过应用层调试。 1、过双机调试,这里也分两步 (1)首先要保证debug模式下启动游戏不蓝屏。 我也是第一次研究TP,对这之前的保护不了解,不过看网上所说这个启动蓝屏似乎是最近几个月新加的。 要过这个需要对内核调试引擎有一定的了解,不过还好我们是站在巨♂人♀的肩膀上,在看雪找到了篇帖子,比较详细的分析了系统启动时内核调试引擎初始化的几个标志。 TP只是检测了其中一个(待定), KdEnteredDebugger,它通过MDL映射来判断这个标志是不是True,如果是就蓝屏,解决方法我照抄了那篇帖子,直接在Hook一下IoAllocateMdl, 把判断的地址改到一个恒为False的地方这样就可以绕过了 [C++] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 PMDL newIoAllocateMdl( __in_opt PVOID VirtualAddress, __in ULONG Length, __in BOOLEAN SecondaryBuffer, __in BOOLEAN ChargeQuota, __inout_opt PIRP Irp OPTIONAL) { if (VirtualAddress == KdEnteredDebugger) { //DbgPrint("[KdEnteredDebugger] address: %p\n", KdEnteredDebugger); VirtualAddress = ( PUCHAR )KdEnteredDebugger + 0x30; //据观察,+0x30 的位置恒为0 } return oldIoAllocateMdl(VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp); } 不过这样做带来一个问题,蓝屏是不蓝屏了,TP的驱动模块也能加载,但只能启动登陆客户端Client.

C++学习:使用libssh2实现交互式shell的ssh2,linux和windows通用

使用ssh2实现shell自动化测试,实际工作中遇到非常多。各种语言都有相应的库可以使用。比如,c/c++语言可以使用libssh2;python可以使用paramkio库等。但这些库网上的帮助,都不是很全,都比较浅显。shell自动化,最基本的三个需求,一个是适合多重类型的操作系统;二是要能够支持交互式shell,比如使用sudo执行时,需要输入密码;三是读数据时要非阻塞的。 paramkio好像不支持交互式(shell命令不需要再根据输出输入不同的参数,实际上,这种情况遇到非常多),而且paramkio在windows上也很不好用,要实现非阻塞,找了几天都没能找到好的办法。 libssh2表面上不支持交互式,官方的例子也没有针对交互式shell进行举例,给库的使用者带来很大的困扰,比较难入门。实际上libssh2库是支持交互式shell的,而且支持多种OS,实现起来也相当的简单,只是过程摸索过于痛苦。关于libssh2的编译,也比较简单,这里就不列举了。libssh2是c语言的,样例写起来很繁琐,因此我用c++进行封装,学习起来比较直观。 实际libssh2两个官方的样例scp.c和scp_echo.c已经提供了交互式shell的实现方式,只是scp_echo.c有关ssh2登陆认证方式,没有像scp.c使用了ssh2的键盘交互式方式,一般ssh2服务器默认提供这个认证方式。scp_echo.c不容易调试通过。 首先,先看一下实现Ssh2类的使用代码: #include <iostream> #include "ssh2.h" int main(int argc, const char * argv[]) { using namespace std; using namespace fish; Ssh2 ssh("127.0.0.1"); ssh.Connect("test","xxxxxx"); Channel* channel = ssh.CreateChannel(); channel->Write("cd /;pwd"); cout<<channel->Read()<<endl; channel->Write("ssh 127.0.0.1"); cout<<channel->Read(":")<<endl; channel->Write("xxxxxx"); cout<<channel->Read()<<endl; channel->Write("pwd"); cout<<channel->Read()<<endl; delete channel; return 0; } 读写都是非阻塞的,这个实际使用非常方便。代码就不详细讲解了。 Ssh2类的实现代码如下: class Ssh2 { public: Ssh2(const string &srvIp, int srvPort=22 ); ~Ssh2(void); bool Connect( const string &userName, const string &userPwd); bool Disconnect(void); Channel* CreateChannel(const string &ptyType = "

VB调试中的条件断点

假如某For循环中,最终发现当i=31时出错,这时你需要在i=31时单步调试,有4个方法: 1.在n = fun1(i)行设置断点,然后按F5一步步到i=31时改按F8进入子函数单步调试 2.插入一小片代码设置断点,例如: Visual Basic code ? 1 2 3 4 5 6 7 8 9 10 Dim i%, n% For i = 1 To 100 '其他代码 if i=31 then aa=1 '在这行设置断点,这行本身没有意义就是为了可以设置断点的。 end if n = fun1(i) debug.print i,n '其他代码 Next 3.用debug.assert Visual Basic code ? 1 2 3 4 5 6 7 8 Dim i%, n% For i = 1 To 100 '其他代码 debug.assert i<>31 n = fun1(i) debug.

Cocos2d-x碰撞检测原理与英雄要打死怪物--之游戏开发《赵云要格斗》(7)

这里是Evankaka的博客,欢迎大家前面讨论与交流~~~~~~ 转载请注明出处http://blog.csdn.net/evankaka/article/details/42689689 本文将详细讲述cocos2dx中英雄与怪物的碰撞检测原理,其实就是精灵和精灵碰撞检测哈。本文主要从矩形碰撞入手,自己编写了一个矩形碰撞检测的函数,并且在游戏中来进行应用。另一方面,当英雄出动攻击后,如果英雄和怪物碰撞到的话,怪物就要掉血,并且当怪物血量为0时,怪物死亡,死亡之前它还会倒在地上闪烁几下。下面,开始吧 cocos2d-x版本:2.2.5 工程环境:windows7+VS2010 打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开 源码免费下载 先来看看效果: 目录 一、精灵碰撞检测原理 二、自定义碰撞检测函数 三、英雄要打死怪物 四、思路总结 一、精灵碰撞检测原理 碰撞检测网上有很多人在讲,但是一般都只讲怎么用,也都没具体的讲讲原理,自己下来就摸索了下,发现其实这个确实很简单。 首先,我们来看看两个矩形,我们定义如下两个矩形,矩形1:红色;矩形2:黑色 如果我们把它们所有的不碰撞的情形列出来,那么其它的不就是碰撞的么,想到这一点,我就从这个出发,然后它们不碰撞的情形我们可以分为四种 矩形1:红色;矩形2:黑色 1.矩形1在矩形2左方,两者无碰撞 成立条件:x1+w1*0.5<x2-w2*0.5 2.矩形1在矩形2右方,两者无碰撞 成立条件::x1-w1*0.5>x2+w2*0.5 3.矩形1在矩形2下方,两者无碰撞 成立条件::y1+h1*0.5<y2-h2*0.5 4.矩形1在矩形2上方,两者无碰撞 成立条件:y1-h1*0.5>y2+h2*0.5 上面四种就是所有的不碰撞的情况了,然后我们弄个判断,依次检测上面四种情形,一旦发现有一种情况成立,就返回无碰撞,如果四种情况都不成立,那恭喜你了,碰撞成功了! 二、自定义碰撞检测函数 碰撞检测对于精灵类可以用 sprite1->boundingBox().intersectsRect(sprite1->boundingBox()) 只不过我这个游戏中的英雄和怪物都是自己定义的类,所以直接调用上面的函数就出点儿问题,所以自己就把前面碰撞检测的原理写了个函数,可以直接调用了,不用管你是什么对像。 首先,在用到碰撞检测的地方#include "HelloWorldScene.h" 定义函数 //矩形碰撞检测 bool isRectCollision (CCRect rect1, CCRect rect2); 然后在其实现函数里HelloWorldScene.cpp里: ///碰撞检测 bool HelloWorld::isRectCollision (CCRect rect1, CCRect rect2) { float x1 = rect1.origin.x;//矩形1中心点的横坐标 float y1 = rect1.origin.y;//矩形1中心点的纵坐标 float w1 = rect1.size.width;//矩形1的宽度 float h1 = rect1.size.height;//矩形1的高度 float x2 = rect2.

varchar和text说不清的那些事

最近有几个同学问我varchar和text有啥别吗,这个问题,以前说真的也没太多的整理,以前遇到text在设计中就是尽可能的拆到另一个表中,保持主表尽量的瘦小,可以让innodb bp缓存更多的数据。 今天借次机会系统整理一下,主要从存储上,最大值,默认值几个方面进行比较。 BTW: 从ISO SQL:2003上讲VARCHAR是一个标准型,但TEXT不是(包括tinytext).varchar在MySQL 5.0.3之前只支持0-255byte, 在5.0.3之后才支持到0-65535byte. 从存储上讲: - text 是要要进overflow存储。 也是对于text字段,不会和行数据存在一起。但原则上不会全部overflow , 会有768字节和原始的行存储在一块,多于768的行会存在和行相同的Page或是其它Page上。 - varchar 在MySQL内部属于从blob发展出来的一个结构,在早期版本中innobase中,也是768字节以后进行overfolw存储。 - 对于Innodb-plugin后: 对于变长字段处理都是20Byte后进行overflow存储 (在新的row_format下:dynimic compress) 说完存储后,说一下使用这些大的变长字段的缺点: - 在Innobase中,变长字段,是尽可能的存储到一个Page里,这样,如果使用到这些大的变长字段,会造成一个Page里能容纳的行 数很少,在查询时,虽然没查询这些大的字段,但也会加载到innodb buffer pool中,等于浪费的内存。 (buffer pool 的缓存是按page为单位)(不在一个page了会增加随机的IO) - 在innodb-plugin中为了减少这种大的变长字段对内存的浪费,引入了大于20个字节的,都进行overflow存储, 而且希望不要存到相同的page中,为了增加一个page里能存储更多的行,提高buffer pool的利用率。 这也要求我们, 如果不是特别需要就不要读取那些变长的字段。 那问题来了? 为什么varchar(255+)存储上和text很相似了,但为什么还要有varchar, mediumtext, text这些类型? (从存储上来讲大于255的varchar可以说是转换成了text.这也是为什么varchar大于65535了会转成mediumtext) 我理解:这块是一方面的兼容,另一方面在非空的默认值上varchar和text有区别。从整体上看功能上还是差别的。 这里还涉及到字段额外开销的: - varchar 小于255byte 1byte overhead - varchar 大于255byte 2byte overhead - tinytext 0-255 1 byte overhead - text 0-65535 byte 2 byte overhead - mediumtext 0-16M 3 byte overhead - longtext 0-4Gb 4byte overhead 备注 overhead是指需要几个字节用于记录该字段的实际长度。

Python父进程退出后,子进程自动退出的办法

PR_SET_PDEATHSIG (since Linux 2.1.57) Set the parent process death signal of the calling process to arg2 (either a signal value in the range 1..maxsig, or 0 to clear). This is the signal that the calling process will get when its parent dies. This value is cleared for the child of a fork(2). import ctypes libc = ctypes.CDLL('libc.so.6') pid = os.fork() if pid == 0: libc.prctl(1, 15) # something in child elif pid > 0: # something in child

【ASP】数据库查询的内容分页显示

对于大数据的查询,你不可以一次性地把所有数据中显示出来, 比如一张学生表上面有一百多号人, 那么在页面中就应该一次显示10人左右, 提供翻页功能给用户进行翻阅,不要一次性显示100多号人。 翻页系统是网页中很常见的功能 一、基本目标 首先还是在Access2007数据库有一张有8条数据的用户信息表, 在页面做分页显示, 翻到最后一页,翻到最前一页,提示暂无记录,给一个超级链接让用户返回 每一页用户可以自定义显示1条、2条、3条记录,如果做100条记录的翻页,可以设置成每页显示10条、15条、20条记录 定义显示不同记录的时候,页数的多少会随之改变 翻页时,下拉菜单会提示翻到哪一页,用户可以自定义翻到哪一页, 二、制作过程 整个系统就一个页面page.asp,翻页与显示记录的多少是通过id与per来控制的。 页面参数由于id与per并不是什么涉及安全性的或者大数据的变量,故使用get方法传递 整个页面的代码如下,每一段都有注释的,请看注释即可: <!--asp页面必须要有此句,否则页面乱码--> <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!--页面使用utf-8否则容易乱码--> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>翻页</title> </head> <body> <h1>名单:</h1> <!--拿走穿过来的id变量与per变量,如果拿不到,那么用户必定是第一次进入这个页面了,默认id为1,从数据库的第一条记录开始,per为1,一条记录--> <!--注意asp中判断变量是否为空的方法--> <% id=Request.QueryString("id") if id="" then id=0 end if %> <% per=Request.QueryString("per") if per="" then per=1 end if %> <!--lower与upper必须定义,asp不支持即时运算的算术表达式,此两个变量时同个数学的方法确定查询test中id的范围--> <!--asp由于变量是没有类型的,变量间数字间的运算必须使用cint来声明此乃数字运算,否则默认是字符串的连接运算--> <% lower=0 upper=0 lower=cint(id)*cint(per) upper=cint(id)*cint(per)+cint(per)+1 %> <!--连接数据库--> <% db="

【ASP】连接Access数据库的登陆系统

一、基本目标 首先在Access数据库Database.mdb中存在着用户信息表test: 编写一个登陆系统,如果用户输入的用户名在表中没有,则提示“查无此人”,如果输入密码错误,则提示“密码错误” 如果用户输入的用户名与密码都正确,则跳转到登陆成功页 登陆成功页在普通情况下,不允许通过输入网址就能访问 二、基本思想 使用asp的session对象确保了用户名与密码的传递。 弹出部分使用了javascript的脚本语言 使用asp对用户信息表进行查询。 站点的基本结构如下: 三、制作过程 整个站点使用utf-8码保证不会乱码,所以每一页在页头必须有<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />,如果使用DW的高版本则自动添加,低版本请把gb2312改成utf-8,记事本自便。 1、登陆页面login.html仅仅是一个表单的静态页面。关键是用post方法传递信息,Action是到login.asp <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>login</title> </head> <body> <form method="post" action="login.asp"> username:<input type="text" name="username" /> password:<input type="password" name="password" /> <input type="submit" value="login" /> </form> </body> </html> 2、login.asp登陆验证页面是本系统最核心的页面 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="

【ASP】ASP对Access数据库的连接、增删改查及ASP的基本语法

本文讨论的是ASP,而不是Visual Studio写出来的.ASPX也就是ASP.NET。 ASP不需要任何插件的支持,关键你是配置好WINDOWS的IIS服务器,把页面扔在上面执行就可以了。 不同WINDOWS系统的IIS服务器配置,除了某些被阉割的WINXP装机版系统之外,都支持IIS服务器配置,都在WINDOWS的组件中,不需要下载任何东西。如何配置IIS服务器不是本文讨论的重点。 一、基本目标 假设Access2007数据库database.mdb中存在表test如下: id为自增列,username,password皆为文本 现在要求把这张表在ASP页面中查询出来。并且再下面继续增加一项username=3,password=a的内容。 运行asp网页的时候记得把access关掉,不可以边打开access边运行asp网页。 二、制作过程 asp代码必须写在<%%>之中, asp声明变量可以用dim a;声明,a不分类型,系统自动识别。dim可以不写,也就是完全可以写出a=什么, 改变a的值必须用set a=..不能直接a=...,此乃对a的初始化。 数据库声明部分conn与rs的值必须用set conn的形式赋予,因为系统已经自动对其初始化。 <head>部分不需要引用任何文件。 整个网页的代码如下,下面一段一段进行说明: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>数据库的连接、增删改查</title> </head> <body> <% db="Database.mdb" Set conn = Server.CreateObject("ADODB.Connection") conn.Open "driver={Microsoft Access Driver (*.mdb)};pwd=admin;dbq=" & Server.MapPath(db) response.write "数据库连接成功!" Set rs = Server.CreateObject( "ADODB.Recordset" ) sql = "select * from test;" rs.open sql,conn,1,3 %> <br/> 表test的内容: <table border="1"> <tr> <td>id</td> <td>username</td> <td>password</td> </tr> <% if (rs.

php接收textarea内容后如何显示换行和空格

php接收表单提交的信息之后 存入数据库 再次从数据库获取数据再前端显示时 空格还有回车都消失了; 解决办法: 1,存入数据库时候进行替换 2,或者在取出数据之后进行替换 然后再在html中显示 str_replace(" "," ",str_replace("\n","<br/>",$_POST['content'])); 第一步进行回车替换 然后进行空格替换 也可以使用nl2br进行回车替换 echo nl2br($_POST['content']); //nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />)。 注:要用双引号,不然无法替换;

libcurl的使用总结(一)

最近的项目中由于要在C++代码中调用PHP的URL,所以不得不借助libcurl这个库,由于第一次用,所以很多地方很是纠结,特此写在这里,方便给同样刚入门的朋友指引。 分两篇介绍,第一篇是理论知识,第二篇是实例。快速链接–libcurl的使用总结(一) 一.下载安装 1.到http://curl.haxx.se/download.html上下载最新版本,由于公司的机器安装rpm有依赖关系,所以直接下载了source 2.编译。解压后进入curl的目录,直接执行 make all 就行。 3.等待编译结束后,可以查看目录结构。 curl/include/curl : 头文件目录 (一般只要包含curl.h即可) curl/lib/.lib/ : lib文件目录(有libcurl.a和libcurl.so,注意,如果这两个文件在同一目录下,-lcurl默认是链接.so滴) 二.函数简要说明 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程: 1. 调用curl_global_init()初始化libcurl 2. 调用 curl_easy_init()函数得到 easy interface型指针 3. 调用curl_easy_setopt设置传输选项 4. 根据curl_easy_setopt设置的传输选项,实现回调函数以完成用户特定任务 5. 调用curl_easy_perform()函数完成传输任务 6. 调用curl_easy_cleanup()释放内存 在整过过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它。 1)CURLcode curl_global_init(long flags); 描述: 这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用) 如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动完成。 参数:flags CURL_GLOBAL_ALL //初始化所有的可能的调用。 CURL_GLOBAL_SSL //初始化支持 安全套接字层。 CURL_GLOBAL_WIN32 //初始化win32套接字库。 CURL_GLOBAL_NOTHING //没有额外的初始化。 2)void curl_global_cleanup(void); 描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。 3.char *curl_version( ); 描述: 打印当前libcurl库的版本。 4)CURL *curl_easy_init( ); 描述: curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理. 一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中.

vim 跳到指定行

在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标所在的行 Ctrl+g

HM学习心得

帧内模式决策的认识 最近,随着对HM认识的了解更加深入,对一些以前只是在理论上认识的知识,在HM的实现上如何实现有了具体的认知。现在总结下,对帧内模式决策的认识。 首先,分析下帧内模式决策的理论知识。在HEVC帧内模式决策的最佳模式过程需要四个过程(其实也可以说是三个过程)。 首先,是对35种帧内模式进行RMD(粗选择)。在RMD中主要实现对35种模式低复杂度代价的计算,根据PU的大小选取代价较小的前几个模式构成初始候选模式集,进行下一过程。 其次,进行MPM(最有可能模式选择)。所谓的MPM即,判断RMD后的模式是否包含有当前PU左邻近与上邻近的最佳模式。如果RMD后的模式不包含当前PU左邻近与上邻近的最佳模式,则将相应不包含的模式纳入初始候选模式集;反之,则不进行处理。 再次,对经MPM的初始候选模式集进行RDO过程。此时的RDO过程是在TU最大尺寸上进行的,从候选模式集中选出RDcost最小的模式,作为当前PU的最佳模式。 最后,在最佳模式上进行RQT,即在最佳模式上决定最佳TU分割。(之所以说三个过程就可以,那是因为前三个过程已经确定了最佳模式,只不过在RDO中也涉及到了TU,所以就说是四个过程了。) 具体代码实现如下各图所示。 图1 RMD 图2 MPM 以下程序为RDO过程: for( UInt uiMode = 0; uiMode < numModesForFullRD; uiMode++ )//对RMD和MPM后的模式集进行RDO { // set luma prediction mode UInt uiOrgMode = uiRdModeList[uiMode]; pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth ); // set context models if( m_bUseSBACRD ) { m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] ); } // determine residual for partition UInt uiPUDistY = 0; UInt uiPUDistC = 0; Double dPUCost = 0.

点击提交按钮触发ajax请求时,做到处理完前一个请求后再处理第二个请求

目的:点击提交按钮触发ajax请求时,做到处理完前一个请求后再处理第二个请求;提高用户体验。因为如果不这样限制的话,用户点击频率太高,会导致服务器返回的第二条请求快过第一条的响应速度。 代码如下:不是很好,先这样做吧,有更好的处理方法的话,再总结 <!doctype html> <html> <head> <meta charset="utf-8"> <title>充值</title> <script src='./jquery-1.7.2.min.js'></script> </head> <body> <ul> <li><input name='sub' class="submit" id='1' οnclick='test(this)' type="button" value="确认提交"/></li> <li><input class="return" type="submit" value="返回修改"/></li> </ul> <input type='hidden' value='OK' name='ff' id='ff'/> <script> function fuck_you(){ var test = 13; $.ajax({ url:'index.php', data:{'test':test}, dataType:'JSON', type:'post', success:function(data){ if(data.msg == 'OK'){ $('input[name=sub]').attr('id','1'); $('input[name=sub]').attr('value','确认提交') alert('成功'); }else{ $('input[name=sub]').attr('id','1'); $('input[name=sub]').attr('value','确认提交') alert('失败'); } } }).done().fail().always(); } function test(obj){ var _status = obj.id; if(_status != '1' || _status == undefined){ $('input[name=sub]').

Spring与Mybatis三种常用整合方法

本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接http://code.google.com/p/mybatis/ 下载到。 1、采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数。 (1)Spring配置文件: <beans > <!-- 引入jdbc配置文件 --> <context:property-placeholder location="jdbc.properties"/> <!--创建jdbc数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="initialSize" value="${initialSize}"/> <property name="maxActive" value="${maxActive}"/> <property name="maxIdle" value="${maxIdle}"/> <property name="minIdle" value="${minIdle}"/> </bean> <!-- 创建SqlSessionFactory,同时指定数据源--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> <!--创建数据映射器,数据映射器必须为接口--> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.xxt.ibatis.dbcp.dao.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="userDaoImpl2" class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl2"> <property name="

HEVC测序序列特点介绍

在进行HEVC快速算法研究中,经常要做测试。拿哪 个序列做测试是一个问题,总不能每次都对所有的序列测试,这样的话工作量太大了。经过阅读文献与经验的总结,个人认为做测试的序列应满足如下条件: 第一:每种类别(Class)的序列都应该涉及;在“Common HM test conditions and software reference configuration”文献中,规定了帧内、帧间预测时的配置及测试序列类别,从Class A 到 Class E,其分辨率分别为2560X1600、 1920X1280、832X480、 416X240、1080X720。在做测试的时侯尽量每种类别都选取一到两个; 第二:尽量包含每种类别的纹理复杂和纹理简单的序列。各个测试序列的纹理情况见下表1所示(个人总结,仅供参考)。 表1 相信只要在做初步测试的时候用满足这样条件的测试序列跑程序,如果出来的数据情况良好的话,那么测试剩余的序列的测试结果应该不会坏到哪里去。(如果有个别序列的数据太差的话,那可以用Class F序列代替试下!) 补充描述:Traffic:复杂背景,对象有适度的、中等的运动;Vidyo:缓慢运动;Vidyo4:简单序列;FourPeople:简单的背景,缓慢的对象运动;Cactus:复杂不规则运动; BasketballDrill:快速、不规则运动。BQSquare:适度的、中等的运动;ParkScene:中等的运动。