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

来源:互联网 发布:福利彩票 知乎 编辑:程序博客网 时间:2024/05/01 00:53

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

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 )"



原创粉丝点击