zoukankan      html  css  js  c++  java
  • 发现中文版《C Primer Plus第五版》示例程序的一个错误

    错误的程序出现再第17章的499页ListItemCount()和500页的Traverse()两个函数上。

    原著包含所有函数定义的list.c如下:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include "list.h"
     4 
     5 static void CopyToNode(Item item,Node * pnode);
     6 
     7 void InitializeList(List * plist)
     8 {
     9     *plist = NULL;//movie = NULL
    10 }
    11 
    12 bool ListIsEmpty(const List * plist)
    13 {
    14     if(*plist==NULL)
    15         return true;
    16     else
    17         return false;
    18 }
    19 
    20 bool ListIsFull(const List * plist)
    21 {
    22     Node * pt;
    23     bool full;
    24     pt = (Node *)malloc(sizeof(Node));
    25     if(pt==NULL)
    26         full = true;
    27     else
    28         full = false;
    29     free(pt);
    30     return full;
    31 }
    32 
    33 
    34 unsigned int ListItemCount(const List * plist)
    35 {
    36     unsigned int count = 0;
    37     Node * pnode = *plist;
    38 
    39     while(pnode!=NULL)
    40     {
    41         ++count;
    42         pnode = pnode->next;
    43     }
    44     return count;
    45 }
    46 
    47 
    48 bool AddItem(Item item,List *plist)
    49 {
    50     Node * pnew;
    51     Node * scan = *plist;
    52 
    53     pnew = (Node *)malloc(sizeof(Node));
    54     if(pnew == NULL)
    55         return false;
    56 
    57     CopyToNode(item,pnew);
    58     pnew->next = NULL;
    59     if(scan==NULL)
    60         *plist = pnew;
    61     else
    62     {
    63         while(scan->next!=NULL)
    64             scan = scan->next;
    65         scan->next = pnew;
    66     }
    67     return true;
    68 }
    69 
    70 
    71 void Traverse(const List * plist,void(*pfun)(Item item))
    72 {
    73     Node * pnode = *plist;
    74     while(pnode!=NULL)
    75     {
    76         (*pfun)(pnode->item);
    77         pnode = pnode->next;
    78     }
    79 }
    80 
    81 
    82 void EmptyTheList(List * plist)
    83 {
    84     Node * psave;
    85     while(*plist!=NULL)
    86     {
    87         psave = (*plist)->next;
    88         free(*plist);
    89         *plist = psave;
    90     }
    91 }
    92 
    93 
    94 
    95 static void CopyToNode(Item item,Node * pnode)//静态函数限制该函数只能在本文件内使用
    96 {
    97     pnode->item = item;
    98 }

    但是在film3.c中调用的形式分别如下:

    1 Traverse(movies,showmovies);                                                //传递的是movies指针的拷贝
    2 
    3 printf("You entered %d movies.
    ",ListItemCount(movies));     //传递的也是movies指针的拷贝

    也就是说,函数调用的时候已经传递的是指针了,但函数体内调用时却又把它当成指针的地址,及指向指针的指针,从而发生错误

    解决的方法有两个,一是更改函数调用如下:

    1 Traverse(&movies,showmovies);                                 //传递的是movies指针的地址
    2 
    3 printf("You entered %d movies.
    ",ListItemCount(&movies));//传递的也是movies指针的地址

    二是更改这两个函数的函数体:

     1 unsigned int ListItemCount(const List * plist)
     2 {
     3     unsigned int count = 0;
     4     Node * pnode = plist;
     5 
     6     while(pnode!=NULL)
     7     {
     8         ++count;
     9         pnode = pnode->next;
    10     }
    11     return count;
    12 }
    13 
    14 void Traverse(const List * plist,void(*pfun)(Item item))
    15 {
    16     Node * pnode = plist;
    17     while(pnode!=NULL)
    18     {
    19         (*pfun)(pnode->item);
    20         pnode = pnode->next;
    21     }
    22 }

    总之两个方法都可以,不知道是原著的错误,还是出版社校准的错误,希望大家能看出来。

  • 相关阅读:
    XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)
    Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)
    Ⅸ.spring的点点滴滴--IObjectFactory与IFactoryObject的杂谈
    Ⅷ.spring的点点滴滴--抽象对象和子对象
    Ⅶ.spring的点点滴滴--自定义对象行为
    Ⅵ.spring的点点滴滴--自定义类型转换器
    Ⅴ.spring的点点滴滴--引用其他对象或类型的成员
    Ⅳspring的点点滴滴--方法和事件
    Ⅲ.spring的点点滴滴--赋值
    Ⅱ.spring的点点滴滴--对象
  • 原文地址:https://www.cnblogs.com/Zbtrik/p/3938220.html
Copyright © 2011-2022 走看看