周伟明的专栏

<<软件测试实践>> 已上市

周伟明ID:drzhouweiming
179885次访问,排名358好友0人,关注者8
软件技术爱好及研究者
drzhouweiming的文章
原创 48 篇
翻译 0 篇
转载 0 篇
评论 312 篇
周伟明的公告
一书已上市, 欢迎大家提出意见!
最近评论
algcfx:Wow gold
dimire:LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
……
dimire:学习了
dimire:LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
……
dimire:LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
……
文章分类
    收藏
      相册
      最近文章
      1、多核新观念-象使用内存一样使用CPU?
      2、多核编程中的任务随机竞争模式的概率分析
      3、OpenMP创建线程中的锁及原子操作性能比较
      4、多核编程中的任务分组竞争模式
      5、称球问题的测试解法
      90%程序员写不出无BUG的二分查找程序?
      C/C++代码检视实例
      多核编程中的负载平衡难题
      多核编程中的锁竞争难题
      微软过桥问题与测试人员素养
      接口关系稳定原理探索
      接口设计定理
      模块分解原理与三权分立
      模块分解原理的探索
      测试驱动需求分析
      筑一座坝治好中国的沙漠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 《多任务下的数据结构与算法》一书的勘误收藏

      新一篇: 《多任务下的数据结构与算法》一书中的红黑树的测试代码,供读者参考!

      目前发现的错误如下,相信书中还有许多问题未被发现,请大家发现新的错误及时提出,我会尽快修正的。

      1、P52页 第15行 原文“返回0表示在HOOK数组中的序号” 修改后为“成功时返回在HOOK数组中的序号

      2、P53页 第15行 原文“返回0表示在HOOK数组中的序号” 修改后为“成功时返回在HOOK数组中的序号

      3、P164,P165页的Xcopy()函数代码有误,正确代码如下:

       /** 将一个目录及子目录下的所有文件复制到另外一个目录下

       @param char *pszSrcDir - 要拷贝的源目录 
       @param char *pszTargeDir - 目标目录 
       @param BOOL bOverWrite - 覆盖标志,FALSE表示覆盖 
       @return void - 无 
      */
      void Xcopy( char *pszSrcDir, char *pszTargeDir, BOOL bOverWrite )
      {
       char   lBaseSearch[MAX_PATH];
       HANDLE   lhFile;
       WIN32_FIND_DATA lfData;

       sprintf( lBaseSearch, "%s\\*.*", pszSrcDir );
       lhFile = FindFirstFile( lBaseSearch, &lfData );
       if ( lhFile == INVALID_HANDLE_VALUE ) {
        return;
       }
       do {
        CreateDirectory( pszTargeDir, NULL );
        if ( !strcmp( lfData.cFileName, "." ) ||
          !strcmp( lfData.cFileName, ".." )) {
         /* 跳过 . and .. 不处理 */
         continue;
        }
        if ( lfData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
         /* 目录 */
         char szBaseDir[MAX_PATH];
         char szTargeDir[MAX_PATH];

         sprintf( szBaseDir, "%s\\%s", pszSrcDir, lfData.cFileName );
         sprintf( szTargeDir, "%s\\%s", pszTargeDir, lfData.cFileName );
         Xcopy( szBaseDir, szTargeDir, bOverWrite );
        }
        else {
         /* 普通文件 */
         char szBaseDir[MAX_PATH];
         char szTargeDir[MAX_PATH];

         sprintf( szBaseDir, "%s\\%s", pszSrcDir, lfData.cFileName );
         sprintf( szTargeDir, "%s\\%s", pszTargeDir, lfData.cFileName );

         CopyFile( szBaseDir, szTargeDir, bOverWrite );
        }
       } while ( FindNextFile( lhFile, &lfData ));
       FindClose( lhFile );
      }

      4、P335页 第13行 原文“发送操作会阻塞在哪里? 修改后为 “发送操作会阻塞在那里。

      5、P203页 第22~29行 原文如下:

        if ( pDelNode == pANode->pLeft )
              {
                  pANode->nMagic -= 1;
              }
              else
              {
                  pANode->nMagic += 1;
              }
      需要将这段代码移到P203页第9行和第10行之间 ,修改后的第9~21行代码为:

              pNode->pData = pDelNode->pData;
              if ( pDelNode == pANode->pLeft )
              {
                  pANode->nMagic -= 1;
              }
              else
              {
                  pANode->nMagic += 1;
              }
              if (pDelNode != pNode->pLeft)
              {
                  pANode->pRight = pDelNode->pLeft;
              }

      6、P265页 倒数第7行 原文 "while (pCursor == NULL)"
         需要在倒数第8行和倒数第7行之间插入以下两行代码:
           if ( pCursor == NULL )
           {
          P266页第11行 原文“pData = pCursor->pData;”
          需要在第10行和11行间插入一个右大括号 “}”

       7P343页倒数第12原文 “for (i = 0; i < uSpaceCount; i++)”

           改为: “for (i = 0; i < uSpaceCount - 1; i++)”

           P343页倒数第5原文 “ pNode->pNext = NULL;”
          需要在倒数第5行后面插入一行 “pNode->uPos = uPos;”
       
      8P3416原文 “UINT uHead;”
              需要在第16行后插入一行 “void *pData;”
                        
              P34倒数第12行,原文“if ( pBlock->uHead == pBlock->uTail )”
              需要在倒数第12行前插入以下一行代码:
                         pData = pBlock->ppData[uHead];
              P34页倒数第3原文       “return pBlock->ppData[uHead];”
              改为:“return pData;”
        
      9、光盘CAPI目录下的DeQueue.c 文件中第146行(DeQue_Destroy()函数里)
            原文:  “for ( i = pQue->pFirst->uMapPos; i <= pQue->pLast->uMapPos; i++)”
            改为以下四行代码:
                          UINT         uStart, uEnd;
                         uStart = pQue->pFirst->uMapPos;
                         uEnd = pQue->pLast->uMapPos;
                         for ( i = uStart; i <= uEnd; i++)
       
      10、光盘中CAPI目录下的DSpaceList.c文件中 (书中这段代码与光盘不一致,以光盘为准)
      文件的第141行 原文pDSNode->uInListFlag = DSPACENODE_NOT_IN_LIST;”
      需要在第140行和141行之间插入以下代码:
                                  else
                                  {
                                           pList->pTail = NULL;
                                }
      253原文 “if ( pDSNode->pSpList->uFreeCount == pList->uDataCount”
      改为:        “if ( pDSNode->pSpList->uFreeCount == pList->uDataCount - 1”
              262行 原文     “/* 从双向链表中删除此节点 */”
              需要在262行前插入以下两行代码
                         if ( pDSNode->uInListFlag == DSPACENODE_IN_LIST )
                         {
      270行 原文       “ if ( pList->pHead = pDSNode )”
      改为: “if ( pList->pHead == pDSNode )”
       
              第278行 原文 “/* pDSNode加入到pEmpty为头节点的未使用链表中 */”
              需在第278行前插入一个右大括号作为一行  “}”
      11P111页倒数第9    原文 “memcpy(pNode->pData, pData, uDataLen);”
      需要在倒数第9行前插入以下一行代码:
      pNode->pData = (void *)((char *)pNode + sizeof(SINGLENODE));
       
      12、光盘CAPI目录下的Queue.c 文件中第72行(Queue_Destroy()函数里)
               原文:  "if ( pQueue->uHead < pQueue->uTail )"
               修改为:"if ( pQueue->uHead > pQueue->uTail )"

      13
      14、P8页倒数第6行,原文“sizeof(pszMsg)”,改为:“MSG_COUNT”
      、光盘CAPI目录下的DeQue.c 文件中第57行(DeQueBlock_Destroy()函数里)
               原文 "if ( pQueue->uHead < pQueue->uTail )"
               修改:"if ( pQueue->uHead > pQueue->uTail )"

      发表于 @ 2006年07月12日 10:23:00|评论(loading...)|编辑

      旧一篇: 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论

      评论

      #hong 发表于2006-07-12 13:50:00  IP: 58.49.254.*
      这个勘误表中的Xcopy的代码,怎么和书中的代码差距那么大?
      虽然我还没试过书中的这个代码,但这个代码不像是没测试过的,是不是拷错了代码呀?
      不过,这位作者出勘误的速度还是挺快的,值得鼓励!
      我试过AVL树的代码,还不错,帮我解决了一点小问题!呵呵!感谢作者!
      #drzhouweiming 发表于2006-07-12 23:16:00  IP: 220.249.249.*
      这位叫hong的网友说得很对,这段Xcopy()函数的代码是我整理代码时疏忽造成的,由于这段代码写完了很长时间,整理时没注意把另外一段还没有完成的代码拷进去了,检查时由于代码太多,疏忽了,在此对读者表示抱歉。

      需要说明一下,由于书中的代码量较大,测试时间有限,有些代码测试用例写得可能不够充分,可能仍然有一定的遗留代码BUG。希望读者发现后能及时指出来,我好及时修正放到勘误表里。

      由于Xcopy是第一次读者指出的错误,所以我今天重新检查部分测试代码,补充了一些测试用例,今天发现了两个新的代码BUG在勘误表里。后续我会继续检查代码里有没有其他BUG,发现后会及时放到勘误表里。
      #drzhouweiming 发表于2006-07-15 01:17:00  IP: 220.249.249.*
      关于书中勘误表中的书中的几个代码BUG的说明:

      1、 勘误表中第11条,BlockList.c 中的BlockList_InsertHead()函数中漏掉一行代码
      错误现象:插入数据会出现异常。
      错误原因:编辑修改过程中疏忽遗漏所致。
      说明:BlockList.c文件是从我以前写过的一个测试过的模块中简化而来,所以BlockList.c文件没有做测试。
      发现及调试修改难度:初学者发现和调试定位修改难度较低。
      2、 勘误表中第10条,这个错误出在DSpaceList.c中的DSpaceList_Alloc()和DSpaceList_Free()函数中。
      错误现象:某些情况下的分配和释放会出错
      错误原因:测试用例遗漏。
      发现及调试修改难度:初学者调试定位修改难度中等。
      3、 勘误表中第9条,DeQue_Destroy()函数中的错误
      错误现象:会出现异常,这个错误初学者容易发现和调试出来。
      错误原因:由于这个函数较简单,没有对这个函数进行测试。
      发现及调试修改难度:初学者发现和调试定位修改难度较低。
      4、 勘误表中第8条,DeQue_PopHead()函数中的一个错误
      错误现象:动态环形队列中只有一个块并且只有一个元素的情况下会出现异常
      错误原因:测试用例遗漏。
      发现及调试修改难度:初学者发现难度中等,调试定位修改的难度较低。
      5、 勘误表中第7条,SpList_Create()函数中的错误。
      错误现象:差1错误导致越界。
      错误原因:漏掉对SpList_Destroy()函数的测试。
      发现及调试修改难度:初学者发现和调试定位修改难度较低。
      6、 勘误表中第6条,HashAVLTree_EnumNext()函数中的错误,
      错误现象:当哈希AVL树中某个BUCKET中有多个元素时会出现这个错误
      错误原因:测试用例遗漏所致。
      发现及调试修改难度:初学者发现难度一般,调试定位修改的难度较高。
      7、 勘误表中第5条,AVLTree_DeleteNode()函数中的错误。
      错误现象:当AVL树删除节点时的某种情况下会出现平衡因子计算错误。
      错误原因:测试用例遗漏。这个错误一般很难发现。
      发现及调试修改难度:初学者发现难度较高,调试定位修改的难度中等。
      #cymwww 发表于2007-06-20 09:13:40  IP: 210.83.227.*
      周老师,您好!
      我想请问下在 hashtable 中的 HashTable_Delete 函数中 是不是 也要处理下 删除的指针是 pCurEntry 时的情景,同时也要更新下 uCurBucketNo 是吗? 若是的话该如何将 code 补充完整呢?
      还有, 针对 整块内存的 链表用来处理 动态等尺寸 的内存分配时,情况还是比较简单点的,要是 处理 动态 不等尺寸 的内存分配,使用 整块 内存可以吗?若是得话该如何处理?

      我看过一些 内存管理方面的 以及 gc 方面的例子,觉得要是达到我的目标还是比较难的,不知周老师有何高见 并给在下一点指导, 我的目标设计如下:

      gc 设计目标:
      1. 同时支持 C 与 C++
      2. 支持多任务 OS
      3. 支持 32 位 与 64 位 指针的系统
      4. 能与 系统的 malloc/free 共存,支持 free 操作
      5. 能同时支持 大对象(>100KB) 与 小对象(<20KB) 创建与销毁
      6. 支持 大堆(>128MB) 与 小堆的(<64MB) 管理
      7. 在大堆的时候支持增量收集模式

      主要是在 1 2 4 ,请指教。也请 同行的 高人们 指点。

      Boehm GC 在 2 好像难以达到。
      #BLsoft 发表于2008-04-24 10:48:42  IP: 219.238.45.*
      书中和代码中没有下面函数的实现 只有定义 
      INT DoubleList_Remove( DOUBLELIST *pList, void *pCur, DESTROYFUNC DestroyFunc );
      DOUBLELIST * DoubleList_Copy( DOUBLELIST *pList, COPYFUNC CopyFunc );
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 周伟明