C/C++中宏的使用

C/C++中使用宏非常的方便,比如下面这一行实现两个元素的交换

cpp代码
  1. #define exch(A,B) { Item t = A; A = B; B = t;} 

但是宏有一个潜在的问题,详见《C++编程思想》关于内联函数一章的具体内容。

问题是什么列?就是宏只是简单的代码替换,并没有内联函数那样的生成临时变量的功能。今天我着实被这个问题坑的很惨。三路划分的快速排序算法结果总是不正确,搞了半个多小时,才发现问题。

阅读全部内容…

Tags:

zzEMC笔试题目--BT递归

要求是只用一条语句(函数体就一个分号)完成功能。要求:
不能有逗号,不能有新变量声明,不能用?:,不能用循环,不能用char int 什么什么的保留字符

cpp代码
  1. #include "stdafx.h"  
  2. #include <iostream>   
  3. #include <cstring>  
  4.  
  5. using namespace std;  
  6. /*  
  7.     函数声明如下  
  8.  
  9. int func(int i ,int N);  
  10.  
  11. 其中i <= N,功能输出i递增到N再递减到i的整数,每行输出一个数。比如func(1,5)就是  
  12. */ 
  13.  
  14. int func(int i,int N)  
  15. {  
  16.     return ((i==N&&printf("%d\n",i))||(printf("%d\n",i)&&func(i+1,N)&&printf("%d\n",i+1)));  
  17. }  
  18.  
  19. void main()  
  20. {  
  21.     cout<<func(1,5)<<endl;       
  22.     getchar();  

本贴地址:http://bbs.yingjiesheng.com/thread-231378-1-1.htm

Tags:

在编程中使用Unicode字符串

Unicode说得简单点,看看C#和JAVA,所有的字符不管汉字还是英文,计算length的时候都是1。

这有个好处,就是跟人处理起来是一样的思路,而不是非得用机器的思维来考虑怎么处理字符串的问题。而使用ANSI字符串,英文字符是一个char,中文字符两个char,最头痛的是你还得自己根据char的取值范围来判断一下这是一个英文还是中文中的一部分,再来做决定如果取一单位的substring的话,应该怎么搞。

另外一个好处就是C/C++写出来的东西可以与COM和.NET程序可以很好的互通,因为他们都使用Unicode,如果自己也用,大家在交互字符串的时候会非常方便。

阅读全部内容…

Tags:

utf-8编码容易被忽视的问题

InfoTV的节目单是用XML方式从YP服务器下载的。先走HTTP协议,保存到本地的program.xml,然后解析出来,填入节目列表中。

之前测试的时候,有个问题一直没发现。现在频道变多了,问题出来了。早上新开了一个频道后,发现节目单保存的XML文件有的字节错位了,导致加载进来的频道ID的hash值是错误的。

看了看程序,发现我的下载缓冲区是1024个字节,估计是这里有问题。一次下载1024,然后下一次下载的时候,可能有一个字符被截断了,导致保存下来的是错位的乱码。utf-8一个字符是不定长的,可能是2可能是3,那么下载缓冲区大小不合适就会造成单个字符给截断,缓冲区用1024字节,使用GBK编码搞定,呵呵。

阅读全部内容…

Tags:

堆被损坏,这也说明**.exe中或它所加载的任何DLL中有bug

昨天调程序,recvfrom接收UDP数据,修改了一下缓冲区,将数据填进来,然后程序结束时始终报这个异常。

不管用Release还是Debug,然后参照以前的程序把项目设置修改了一下,仍然不能解决。

网上搜索,都说是数组越界造成堆栈出错,问题是我没有对接收数据的缓冲区进行太多的处理啊,只有recvfrom和一个printf设计到这个buffer,百思不得其解。从MSDN上面COPY一个UDP的例子出来,运行仍然报这个错误。

早上来了到VC6里面跑一样的程序,没问题。Debug调试,没有问题。

然后将项目从VC6转换到VC2005,问题出现了。O,F*CK!

绝望之下直接运行Release目录下的EXE,不从VS启动了,测试了一下,没有问题,没有抛出任何异常。再一次的F*CK。到底是什么问题?

我猜应该是从VS启动的时候加载了一下调试用的DLL,然后如错误信息所说“它所加载的任何DLL中有bug”。所以直接启动程序不会报这个错误。

Tags: windows

API函数大全(part 2)

7. API之位图、图标和光栅运算函数

BitBlt 将一幅位图从一个设备场景复制到另一个

CopyIcon 制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序

CopyImage 复制位图、图标或指针,同时在复制过程中进行一些转换工作

CreateBitmap 按照规定的格式创建一幅与设备有关位图

阅读全部内容…

Tags: windows

API函数大全(part 1)

1. API之网络函数

WNetAddConnection 创建同一个网络资源的永久性连接

WNetAddConnection2 创建同一个网络资源的连接

WNetAddConnection3 创建同一个网络资源的连接

WNetCancelConnection 结束一个网络连接

WNetCancelConnection2 结束一个网络连接

WNetCloseEnum 结束一次枚举操作

WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接

WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接

WNetEnumResource 枚举网络资源

WNetGetConnection 获取本地或已连接的一个资源的网络名称

WNetGetLastError 获取网络错误的扩展错误信息

WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称

WNetGetUser 获取一个网络资源用以连接的名字

WNetOpenEnum 启动对网络资源进行枚举的过程

阅读全部内容…

Tags: windows

C++中文分词程序

很久以前写的东西了,既然开新的技术博客,就全转过来吧

PHP、PERL、JAVA写的分词程序到处都是,它们使用宽字符集,字母“I”和汉字“我”在计算字长时结果是一样的,C++一般的输入都不是作为宽字符集处理的,使用C++分词,如果能完成窄字符输入,但按宽字符取子串,基本上分词的问题就解决了。(别说你取子串都按2个char算一个字啊,那样的话中英文夹杂的情况下就挂了)

下面是我本科时候写C++中文分词时写的文档,可能写得不太清楚,欢迎大家评论。

阅读全部内容…

Tags:

gcc命令参数详解

gcc最基本的用法是:gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。

-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

阅读全部内容…

Tags: linux