给出关于这个指针程序的反馈

时间:2010-05-06 03:07:17

标签: c++ pointers

这是一个相对简单的程序。但我想得到一些关于如何改进这个程序(如果有的话)的反馈,例如,不必要的陈述?

#include<iostream>
#include<fstream>
using namespace std;

double Average(double*,int);

int main()
{

    ifstream inFile("data2.txt");

    const int SIZE = 4;
    double *array = new double(SIZE);
    double *temp;
    temp = array;

    for (int i = 0; i < SIZE; i++)
    {
        inFile >> *array++;
    }
    cout << "Average is: " << Average(temp, SIZE) << endl;
}

double Average(double *pointer, int x)
{
    double sum = 0;

    for (int i = 0; i < x; i++)
    {
        sum += *pointer++;
    }
    return (sum/x);
}

代码有效且程序运行正常。但我只是想听听你们的想法,因为你们大多数人都有比我更多的经验(我只是一个新生......哈哈)

感谢。

5 个答案:

答案 0 :(得分:4)

修复内存泄漏。 即删除临时; 另外,检查文件是否已打开/创建..等等

理想情况下,您应该使用temp变量来操纵/遍历数组,而不是使用* array本身

答案 1 :(得分:4)

您没有正确初始化阵列。这句话:

double *array = new double(SIZE);

分配一个double并将其初始化为SIZE的值。你应该做的是使用数组分配:

double *array = new double[SIZE]; 

另一个普遍问题是您很少想要将动态分配的内存分配给原始指针。如果要使用基类型而不是std::vector等更高级别的对象,则应始终使用智能指针:

boost::scoped_array<double> array(new double[SIZE]);

现在无论你如何离开你的范围(即从新添加的返回或异常),数组都将自动释放。

答案 2 :(得分:2)

由于我们讨论的是C ++,我建议使用STL容器和算法。我还发现在大多数情况下,最好使用引用或智能指针(例如boost :: shared_ptr)而不是原始指针。在这种情况下,根本不需要指针。

以下是编写程序的方法:

#include <fstream>
#include <vector>
#include <iostream>
#include <numeric>
#include <iterator>

using namespace std;

int main()
{
    ifstream f("doubles.txt");
    istream_iterator<double> start(f), end;
    vector<double> v(start, end);

    if (v.empty())
    {
        cout << "no data" << endl;
        return 0;
    }

    double res = accumulate(v.begin(), v.end(), 0.0);
    cout << "Average: " << res / v.size() << endl;
    return 0;
}

答案 3 :(得分:1)

如果x为0,则平均值将产生被零除错误。

答案 4 :(得分:0)

以下是一些“代码审核”评论:

在main()中:

  1. 将尺寸更改为“size_ t”而不是int
  2. 为什么SIZE是大写的? (可能是作者的惯例是将常量设为大写,在这种情况下它很好。)
  3. 将临时声明和赋值合并为一个语句:double * temp = array;
  4. 如果inFile无效或无法阅读,该怎么办?
  5. 如果inFile的项目数量少于SIZE,该怎么办?
  6. 将循环变量i更改为size_t
  7. 在声明inFile之前删除空白行。
  8. 0返回一些号码(例如main())。
  9. 更正数组的分配。
  10. 在平均值()中:

    1. 将平均值的第二个参数更改为size_t
    2. 断言和/或保护指针为非NULL
    3. 断言和/或防止被零除。
    4. 确认:从其他答案中收集了一些积分。我尽可能地制作完整的清单。