Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24751
  • 博文数量: 11
  • 博客积分: 520
  • 博客等级: 中士
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-16 21:26
文章分类
文章存档

2010年(1)

2007年(10)

我的朋友

分类:

2007-04-24 11:40:58

我的第一个问题是:
以前在编程时不太注意类型的宽度,而这个问题就是发生在这里,原来在32位机下面,unsigned int和unsigned long 的宽度都是4个字节,而unsigned short是2个字节,POINT结构是8个字节(我想可能是x,y都是定义成了unsigned int的原因吧)。很显然这是个低级错误,不过以后再在不同平台上编程时一定要先查清类型宽度。

第二个问题是:
在调试回放程序发现fread的意外结束,很显然我的文件并没有读到文件尾,但是feof确返回了1。后来才发现原来是0x1a的问题。对于f*系列的函数来说有两种模式,1.text模式,2.binary模式。在text下系统会认为0x1a是EOF标志,那么就会认为是到了文件尾,这种情况是在window发现的,很有意思的是在msdn中说fopen默认的模式是binary, 但实际上是text模式。我在unix/linux系统中到每发现这样的问题。所以最好在打开文件的时候指明模式,
text模式:  fopen(fp, "*t");
binary模式: fopen(fp, "*b");

第三个问题是:
在linux下,使用fopen(xxx, "a+");时居然是在文件的尾部添加一个01 00的值然后再附加数据。这点在函数说明文档中没有说明,后来我在linux下测试时也没发现这样的问题,可能是在arm平台下会有这个问题。所以如果想在文件尾部添加数据,最保险的方式是,
fp = fopen(xxx, "a+b");
fseek(fp, 0, SEEK_END);

剩下的问题比较零散不过大部分是语言方面的;
1.成员初始化列表必须在类的第一次调用函数时完成

2.对vector操作时要非常的小心,
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 删除array数组中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
    if( 2 == *itor ) array.erase( itor );
}
这里的问题是array.end()会往前移,结果少删除了一个2

3. 在对char的使用问题上, 如果是在操作unicode,就要用unsigned char来声明。
   如果使用ascii码,可以用char,如果用于描述字节,最好是用unsigned char来描述。

4.内存拷贝的时候,千万要注意内存覆盖的问题。
void* mymemcpy( void *dest, const void *src, size_t count )
{
      char* pdest = static_cast( dest );
      const char* psrc = static_cast( src );

      if( pdest>psrc && pdest      {
           for( size_t i=count-1; i!=-1; --i )
           pdest[i] = psrc[i];
      }
      else
      {
          for( size_t i=0; i          pdest[i] = psrc[i];
      }

      return dest;
}

5.打印出当前源文件的文件名以及源文件的当前行号
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。


6.不使用第三个变量来实现a,b交换
标准的做法是
a = a + b;
b = a - b;
a = a - b;
我个人认为还有一种方法来实现:


7. 合并两个有序表
Node *MLink(Node *headA, Node *headB)
{
    Node *p = headA;
    Node *q = headB;
    Node *pre = p;

    if ( NULL == p && NULL != headB )
    {
        headA = headB;
        return headA;
    }

    while ( NULL != p && NULL != (q=headB) )
    {
        if ( p->data  > q->data )
        {
            headB = q->next;
            q->next   = p;
            pre->next = q;
            pre = q;
        }
        else
        {
            pre = p;
            p = p->next;
        }
    }

    if ( pre != p && NULL == p && NULL != headB )
    {
        pre->next = headB;
    }

    return headA;
}

 以上就是这阶段编程时遇到的一些问题,我想大多数初级程序员或多或少会遇到点这样的问题,所以以后编程要以质量而不是代码行数来衡量自己。

阅读(1754) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~