27 Jun 2012

c++ Tips: C2360:某变量初始化被case跳过的问题解决

c++中的大量if...else...可以用switch...case...来简化,也可以提高程序的运行效率,因为switch...case...其实在编译阶段会被转化为跳转表(LUT),会被分支语句高效.但是有时在case中定义的变量在编译阶段会报"error C2360: initialization of '###' is skipped by 'case' label,解决办法如下: 这是无意间找到的解决办法,将case下的所有语句放入一个block中,也就是用一对大括号{}将原有语句括起来,变成: { 原语句; }这种.其中break;不必放入,这个错误就没有了

26 Jun 2012

c++任意长度高精度幂计算

偶然看到了POJ 1001问题,想起以前python的一个任意长度大数相乘的帖子(在这里),c++的解法也类似,都是用字符串来储存位数即可.此题的一个有意思的地方是对于输入字符串的处理,要考虑各种情况,例如: 0.00(0),10.0(100),0012.00(12),1.0100(1.01),001.0100100(1.01001)等等.第一次做题时候对于这个问题考虑欠周,弄了好几次wrong answer.代码如下:

22 Jun 2012

matlab任意位置绘制坐标轴



有时候需要将x-y的位置绘制在屏幕中心或者其他位置,下面的代码可以实现原点移动到图中心.

19 Jun 2012

c++判断操作系统版本

有时程序运行在不同的操作系统下需要执行不同的操作,c++获取操作系统版本号,可以完成这个操作.

下面的函数判断系统是否是vista之后,返回true/false

18 Jun 2012

xp下用命令行解压缩zip文件

前面有篇帖子提到了使用SHFileOperation函数来模拟explore复制解压缩zip文件,可惜经过测试,在win7和vista下好使,xp系统(32位和64位都已测试)均无效,目前失败原因不得而知,因为没有报错,返回值正常.因此需要另辟蹊径,使用其他办法来解压缩zip文件.除非你想使用现成的开源库(例如zlib,7z等)或者通过调用exe的方式来解压缩.

这里是xp下测试好用的vbs解压缩函数.使用时,只需要将函数写入临时vbs文件,调用cmd运行cscript temp.vbs即可,运行完了删除vbs文件就行.

13 Jun 2012

c++获取dll文件所在的路径

在exe中,可以使用getcwd获得当前路径,一般不会出错,除非使用chdir或者其他函数改变当前路径,dll中如果有dllmain函数,可以使用
char path[_MAX_PATH]; ::GetModuleFileName(NULL, path, _MAX_PATH);
来获得当前路径,有时候需要将调用第一参数指定为调用dll的入口参数中的module
BOOL   APIENTRY   DllMain(
HANDLE   hModule,  
DWORD     ul_reason_for_call,  
LPVOID   lpReserved
)
就是上面的hModule.不过如果dll中不存在dllmain函数,无法用全局变量保存该参数,如何得到dll被动态加载时的路径呢?

c++获取系统时间

c++获取系统时间日期星期时区等信息

7 Jun 2012

c++内存泄露检查


调试代码时检测内存泄露
// debug memory leak
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
// overwrite default definition
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW

然后在所有代码开始前加上


//Check for memory leaks
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);


下面的内容转载自: 这里
一 检查内存泄漏

添加以下语句:

#define CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

以上代码第一行的作用是:输出调息信息的同时输出一些附加信息,例如分配该泄漏内存块的代码所在的文件名、行数。第二、第三行将 malloc 和 free 函数映射到“Debug”版本_malloc_dbg 和_free_dbg,以跟踪内存分配和释放。此映射只发生在调试版本。Release版本使用普通的 malloc 和 free 函数。



程序退出时调用_CrtDumpMemoryLeaks()输出调试信息到VC的调试窗口,也可以设置一个标志,让程序退出时自动输出调试信息,如下所示:

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG )|_CRTDBG_LEAK_CHECK_DF)



有时程序泄漏信息没有文件名和行数信息,例如:

Detected memory leaks!

Dumping objects ->

{52} normal block at 0x06AC2C88, 1234 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

上面的{52}表示该内存块的编号,大多数情况下是固定的。可以将该编号传递给 _CrtSetBreakAlloc以创建一个断点。执行将恰在分配该块以前中断,您可以向上追踪以确定哪个例程执行了错误调用。接着退出程序,观察"输出窗口"的内存泄露信息,验证实际内存分配的编号是不是和预设值相同,如果不相同,说明刚才的断点是无效的,需要尝试其它编号再次跟踪。

二 内存操作越界检查

有时出现内存操作越界,这时可以借助_CrtCheckMemory函数校验所有已分配内存块的有效性(例如内存块两侧边界是否被改写),通过在所有可疑点插入以下代码,定位发生内存越界的代码位置:ASSERT(_CrtCheckMemory());

同时也可以配合使用_CrtSetDbgFlag函数设置_CRTDBG_CHECK_ALWAYS_DF标志,这样每次分配/释放内存时,系统会自动调用_CrtCheckMemory,有助于快速捕获内存错误。

3 Jun 2012

Bournemouth Parking Places

想去海边玩,不知道Bournemouth哪里停车,做了一下research,标记在google地图上,以便下次去的时候方便,这可是号称英国最美的海滩了.据说此地海滩上的沙滩椅曾经创过世界纪录.


红色: 有最长停留时间和no return时间限制;
黄色: 只有最长停留时间限制;
蓝色: 按小时收费,适合长时间停留;
绿色: 同蓝色,按时间收费,不过距离海边更近.


在较大的地图中查看Bournemouth Parking Places