从函数返回二维数组的双精度数

时间:2009-03-30 14:03:33

标签: c++

我有这个课程,在某个时候我正在计算两个双打的数组:

double* QSweep::computeIntersection(double m1, double b1, double m2, double b2){
double* v=new double[2];

v[0]= (b2-b1)/(m1-m2);
v[1]= (m1*b2-m2*b1)/(m1-m2);

return v;
}

在类的另一个函数中,我使用此数组来处理其值。 根据作为参数传输的值,我获得了两个daoubles的这个数组的几个值。我希望将所有这些值保留在两个双精度数组的数组中。 我已经尝试了一些方法,但我有bur错误,segementation故障或所有问题,因为这。 任何想法都受到欢迎。

提前谢谢你, madalina

7 个答案:

答案 0 :(得分:9)

如果它们总是两个值,那么返回std::pair<double, double>会不会更合乎逻辑(也更有用)?这可能会节省很多痛苦,特别是与显式内存管理相关(因为您使用的是new / delete):

std::pair<double, double> QSweep::computeIntersection(
    double m1, double b1, double m2, double b2
) {
    return std::make_pair( (b2-b1)/(m1-m2), (m1*b2-m2*b1)/(m1-m2));
}

答案 1 :(得分:2)

您的另一个选择是更改签名:

void QSweep::computeIntersection(double m1, double b1, double m2, double b2, double& return_v0, double& return_v1)
{
    return_v0 = (b2-b1)/(m1-m2);
    return_v1 = (m1*b2-m2*b1)/(m1-m2);
}

答案 2 :(得分:1)

也许你应该有一个名为Intersection的类型,这个类型很快就完成了:

typedef std::pair<double, double> Intersection

或许在那里应该有更明确的东西,因为对的成员是“第一”和“第二”,也许你可能想要更具描述性的东西。

在任何情况下,您宁愿按值返回这些东西,而不是返回指向堆分配内存的指针。

答案 3 :(得分:1)

您的示例不足以提供有关其崩溃原因的问题的答案。

以下示例将确保未释放的指针没有内存泄漏,并保持类似的结构。

typedef std::pair<double, double> Intersection;
typedef std::vector<Intersection> Plane;

Intersection QSweep::computeIntersection
  ( double m1
  , double b1
  , double m2
  , double b2) 
{
    return Intersection( (b2-b1)/(m1-m2), (m1*b2-m2*b1)/(m1-m2));
}

main() 
{
  Plane plane;
  while( input ){
    plane.push_back( Intersection( ... ) );
  }
}

可能有其他存储方式,例如当你使用double时,你可以使用calloc和realloc来保持一块内存的大小合适。 (到目前为止,不建议给出你的例子)

答案 4 :(得分:0)

使用vector维护您的双打历史记录。如果你继续使用一系列双打,要抓住它们,做这样的事情:

std::vector<double*> history;
history.push_back(v);

注意,当你完成向量(或单个向量元素)时,你仍然需要delete每个元素指向的内存。要解决此问题,请使用pair跟踪原始的双打数组(如果您只使用两个)或vector<double>

答案 5 :(得分:0)

鉴于你所拥有的是两个双打的阵列,我不怀疑有必要在某个时候提高这个数字。就像,如果在某些时候你决定添加3d功能。我愿意继续使用阵列。但是没有必要使用动态数组。使用包含在boost::array之类的结构中的数组:

boost::array<double, 2> QSweep::computeIntersection(
    double m1, double b1, double m2, double b2
) {
    boost::array<double, 2> array = { (b2-b1)/(m1-m2),  (m1*b2-m2*b1)/(m1-m2) };
    return array;
}

然后您可以将其添加到包含以下内容的向量中:

typedef std::vector< boost::array<double, 2> > vec_of_2darray_t;
vec_of_2darray_t v;
v.push_back(computeIntersection(a, b, c, d));
// ...

如果你的目标是简单性和可扩展性,这可能是你能得到的最好的结果。boost::array是一个非常小而简单的结构。它基本上等于

template<typename T, size_t N>
struct array { T data[N]; };

当然,有几个功能,如operator[]begin()end()以及其他功能。但是没有构造函数,所以你可以像上面那样将它初始化为普通数组。

答案 6 :(得分:0)

谢谢:), 它与push_back一起使用每次在

类型的新向量中获得的值
vector <double *>,

madalina