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
19 Jun 2012
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文件就行.
这里是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被动态加载时的路径呢?
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
红色: 有最长停留时间和no return时间限制;
黄色: 只有最长停留时间限制;
蓝色: 按小时收费,适合长时间停留;
绿色: 同蓝色,按时间收费,不过距离海边更近.
在较大的地图中查看Bournemouth Parking Places
Subscribe to:
Posts
(
Atom
)