春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

练习一
        以下函数完全没有检查可能的数据错误以及可能的执行失败。请指出此函数中所有可能发生错误的地方。本题并不考虑出现异常。
        int *alloc_and_init(string file_name)
        {
            ifstream infile(file_name);
            int elem_cnt;
            infile >> elem_cnt;
            int *pi = allocate_array(elem_cnt);

            int elem;
            int index = 0;
            while(infile >> elem)
            {
               pi[index++] = elem;
             }

               sort_array(pi, elem_cnt);
               register_data(pi);

               return pi;
             }
这是书中第203页的练习7.1。

         我自己的答案:打开文件后,未对infile进行判断,是否打开文件成功;pi是否分配成功,未进行判断,它是否为null。

          侯捷老师给的答案如下:
          第一个错误便是“型别不符”。ifstream constructor 接受的参数型别是const char*而非string。这个没有注意到。解决方法是利用string的c_str member function取得其c-style字符串表现形式:
        ifstream infile(file_name.c_str());
        第二个错误是检查infile是否成功开启。
        if  ( !infile ) // 开启失败
        第三个错误就是infile >> elem_cnt 可能执行失败。
        如,文件内含的是文字,那么企图“读入某个数值并置于elem_cnt内”的操作便告失败。此外,文件也有可能是空的。必须检查读取是否成功。
        infile >> elem_cnt;
        if (! infile) // 读取失败

        第四个错误int *pi = allocate_array(elem_cnt);
         无论何时,当我们处理指针时,必须随时注意指针是否的确指向实际存在的对象。如果allocate_array()无法配置足够内存,pi便会被设为0,我们必须检验如下:
          if  ( ! pi ) // allocate_array() 没有配置到内存

 需要说明的是:程序的假设是(1)elem_cnt代表文件中的元素个数;(2)数组索引值index绝不会发生溢出。但是除非我们检查,否则实在无法保证index永远不大于elem_cnt。

第一个错误和第三个错误,没有考虑到。分析看,对于“型别不符”这个问题,一直没有注意到。此外,对于读入文字,没有思考那么多。

努力学习ing……

posted on 2008-11-03 13:35 Sandy 阅读(334) 评论(0)  编辑 收藏 引用 所属分类: c++学习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理