| 风's profile黑天使之家PhotosBlogLists | Help |
|
黑天使之家游星戏斗弄日月,醉卧云端笑人间 November 03 脑筋急转弯及答案1. 哪儿的海不产鱼? 2. 有种动物,大小像只猫,长相又像虎,这是什么动物? 3. 猴子每分钟能掰一个玉米,在果园里,一只猴子5分钟能掰几个玉米? 4. 胖妞生病时,最怕别人来探病时说什么? 5. 什么东西比乌鸦更讨厌? 6. 上海的南京路,来往最多的是什么人? 7. 小刘是个很普通的人,为什么竟然能一连十几个小时不眨眼? 8. 小王中午时候去开会,为什么半个人影也没看到? 9. 情人卡、生日卡、大大小小的卡,到底要寄什么卡给女人,最能博得她的欢心呢? 10. 用椰子和西瓜打头哪一个比较痛? 11. 一对健康的夫妇,为什么会生出一个没有眼睛的后代? 12. 什么水取之不尽,用之不竭? 13. 王先生养了一只很漂亮的孔雀,有一天,王先生的孔雀在张先生的花园里生了一只蛋,请问这只蛋应属于谁的? 14. A君与B君的家均位于新兴的住宅地,相距只有一百米。此地除这两家之外,还没有其他邻居,而且也没有安装电话。现在A君想邀请B君“来家里玩”,在不去B君家邀约的情况下,以何种方法能最早通知B君?假设A君身边装着十张画图纸、奇异笔、胶带与放大镜。 15. 妻子:“糟糕,亲爱的,你送给我的钻石戒指,落到红茶里去了……” 结果,戒指又平安回到妻子的手上,而且一点也没有弄湿的痕迹。这难道是奇迹吗? 16. 电影院内禁止吸烟,而在剧情达到高潮时,却有一男子开始抽烟,整个银幕笼罩着烟雾。但是,却没有任何一位观众出来抗议,这是为什么? 17. 爷爷送给小明一份生日礼物,小明一脚把礼物踢好远,爷爷却说踢得好,为什么? 答案 1. 辞海 2. 小老虎 3. 一个也掰不到 4. 多保重身体 5. 乌鸦嘴 6. 中国人 7. 睡觉的时候 8. 影子没有半个的 9. 信用卡 10. 头比较痛 11. 鸡生蛋……蛋没眼睛 12. 口水 13. 孔雀的 14. 大声吼叫 15. 因戒指是掉进红茶的茶叶罐里 17. 抽烟的男子是电影里的人物 19. 爷爷送的是足球 November 02 一个排序算法:O)//arr 为一包含n个随机数的整形数组
void sort(int min,int max) { int i,j,k; int mid; int tmp; if(min==max) return; if((max-min)<2) { if(arr[min]>arr[max]) { tmp=a[max]; arr[max]=arr[min]; arr[min]=arr[max]; } return; } mid=(max-min)/2-1; sort(0,mid); sort(mid+1,max); while(1) { if(arr[mid]>arr[max]) { tmp=arr[mid]; for(i=mid;i<max;i++) arr[i]=arr[i+1]; arr[max]=tmp; mid--; max--; if(mid<min) break; continue; } max--; if(mid==max) break; } return; } void sorta() { sort(0,n-1); } October 31 程序员的修养1、有专研精神,勤学善问、举一反三。 2、积极向上的态度,有创造性思维。 3、与人积极交流沟通的能力,有团队精神。 4、谦虚谨慎,戒骄戒燥。 5、写出的代码质量高。包括:代码的稳定、易读、规范、易维护、专业。 Program时需要注意的一些细节*内存的分配管理
由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是术语——“内存泄露”(或是“内存漏洞”)—— Memory Leak。于是,系统的可分配内存会随malloc越来越少,直到系统崩溃。 对于malloc和free的操作有以下规则: 1) 配对使用,有一个malloc,就应该有一个free。(C++中对应为new和delete)
2) 尽量在同一层上使用,不要像上面那种,malloc在函数中,而free在函数外。最好在同一调用层上使用这两个函数。 3) malloc分配的内存一定要初始化。free后的指针一定要设置为NULL。 注:虽然现在的操作系统(如:UNIX和Win2k/NT)都有进程内存跟踪机制,也就是如果你有没有释放的内存,操作系统会帮你释放。但操作系统依然不会释放你程序中所有产生了Memory Leak的内存,所以,最好还是你自己来做这个工作。(有的时候不知不觉就出现Memory Leak了,而且在几百万行的代码中找无异于海底捞针,Rational有一个工具叫Purify,可能很好的帮你检查程序中的Memory Leak)
*出错信息的处理 个即有共性,也有个性的错误信息处理,这样做有利同种错误出一样的信息,统一用户界面,而不会因为文件打开失败,A程序员出一个信息,B程序员又出一个信息。而且这样做,非常容易维护。代码也易读。
当然,物极必反,也没有必要把所有的输出都放到errmsg中,抽取比较重要的出错信息或是提示信息是其关键,但即使这样,这也包括了大多数的信息。
*函数名和变量名的命名
———————————— 我看到许多程序对变量名和函数名的取名很草率,特别是变量名,什么a,b,c,aa,bb,cc,还有什么flag1,flag2, cnt1, cnt2,这同样是一种没有“修养”的行为。即便加上好的注释。好的变量名或是函数名,我认为应该有以下的规则: 1) 直观并且可以拼读,可望文知意,不必“解码”。
2) 名字的长度应该即要最短的长度,也要能最大限度的表达其含义。 3) 不要全部大写,也不要全部小写,应该大小写都有,如:GetLocalHostName 或是 UserAccount。 4) 可以简写,但简写得要让人明白,如:ErrorCode -> ErrCode, ServerListener -> ServLisner,UserAccount -> UsrAcct 等。 5) 为了避免全局函数和变量名字冲突,可以加上一些前缀,一般以模块简称做为前缀。 6) 全局变量统一加一个前缀或是后缀,让人一看到这个变量就知道是全局的。 7) 用匈牙利命名法命名函数参数,局部变量。但还是要坚持“望文生意”的原则。 8) 与标准库(如:STL)或开发库(如:MFC)的命名风格保持一致。 *头文件中的#ifndef
—————————— 千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 *注意对in和out参数,系统返回等进行合法性检查,其中比较好的技术是使用断言(assert) 使应用程序只能运行一个实例涉及两个基本的问题,一是在程序的第二个实例启动时,如何发现该程序已有一个实例在运行,而是如何将第一个实例激活,而第二个实例退出。
在UNIX环境下,可以通过程序调用PS查找进程是否存在来判断处理:
char bufStr[BUFLEN]="\0",bufCmd[CMDLEN]="\0";
FILE *fRead; sprintf(bufStr,"ps -ef|grep -v grep|grep -v sh|grep -v vi|grep %s |wc -l",progName); if((fRead=popen(bufStr,"r"))!= NULL) { while(fgets(bufCmd,CMDLEN,fRead)!=NULL){ printf("program has start:%s \n",bufCmd); if(atoi(bufCmd)>0) break; } pclose(fRead); } Windows下,第一个问题,可以通过给应用程序设置信号量,实例启动时首先检测该信号量,如已存在,则说明程序已运行一个实例。第二个问题的难点是获取第一个实例的主窗对象指针或句柄,然后便可用SetForegroundWindow来激活。虽然FindWindow函数能寻找正运行着的窗口,但该函数要求指明所寻找窗口的标题或窗口类名,不是实现通用方法的途径。
HWND CurWnd = ::FindWindow(NULL, _T("日历 "));
if(CurWnd) { if(!(::GetWindowLong(CurWnd, GWL_STYLE) & WS_VISIBLE)) { ::ShowWindow(CurWnd,SW_MINIMIZE); ::ShowWindow(CurWnd,SW_RESTORE); } ::SetForegroundWindow(CurWnd); return FALSE; } 可以用Win 32 SDK函数SetProp来给应用程序主窗设置一个特有的标记。用GetDesktopWindow可以获取Windows系统主控窗口对象指针或句柄,所有应用程序主窗都可看成该窗口的子窗口,即可用GetWindow函数来获得它们的对象指针或句柄。用Win 32 SDK函数GetProp查找每一应用程序主窗是否包含有我们设置的特定标记便可确定它是否我们要寻找的第一个实例主窗。使第二个实例退出很简单,只要让其应用程序对象的InitInstance函数返回FALSE即可。此外,当主窗口退出时,应用RemoveProp函数删除我们为其设置的标记。
HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
// 信号量已存在?信号量存在,则程序已有一个实例运行 if (GetLastError() == ERROR_ALREADY_EXISTS) { // 关闭信号量句柄 CloseHandle(hSem); // 寻找先前实例的主窗口 HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); while (::IsWindow(hWndPrevious)) { // 检查窗口是否有预设的标记?有,则是我们寻找的主窗 if (::GetProp(hWndPrevious, m_pszExeName)) { // 主窗口已最小化,则恢复其大小 if (::IsIconic(hWndPrevious)) ::ShowWindow(hWndPrevious,SW_RESTORE); // 将主窗激活 ::SetForegroundWindow(hWndPrevious); // 将主窗的对话框激活 ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious)); // 退出本实例 return FALSE; } // 继续寻找下一个窗口 hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT); } // 前一实例已存在,但找不到其主窗
// 可能出错了 // 退出本实例 return FALSE; } OnCreate 消息中:
// 设置寻找标记
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1); OnDestroy消息中:
// 删除寻找标记 ::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName); 感觉是越来越懒了最近感觉是越来越懒了,前天和华为的人谈了谈,才发现自己忘了很多东西,忽视了很多,哎,去之前翻翻书好了,心性太差,TCP/IP和SOCKET一下就蒙那不知道说了,出来去吃饭喝酒的时候倒想起来了,NND,还真上不了台面! |
||||
|
|