将指向float的数组传递给接受固定大小数组的函数

时间:2016-11-24 12:35:32

标签: c++ arrays pointers parameter-passing

我有许多具有以下形式的功能:

typedef float arr3[3];
float newDistanceToLine(arr3 &p0, arr3 &p1, arr3 &p2);

现在可以方便地将大量点存储到长数组中:

int n_points = 14;
float *points;
points = new float[3*n_points];

有没有办法将指针传递给数组的不同值“点”到接受固定大小数组的函数?我知道以下失败了,但是,我想做的事情如下:

newDistanceToLine(&points[3], &points[6], &points[9]);

或获取有关如何最好地重复使用代码的任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

newDistanceToLine的界面更改为使用基于可以array_Viewspan调用的模式的类型 - 阅读此discussion

这样的事情:

typedef float arr3[3];
class arr3_view
{
public:
    arr3_view(arr3& arr) : data(arr) {}
    arr3_view(float* data, std::size_t size) : data(data) 
    {
        if (size != 3) // or < 3 - I am not sure what is better for your case
          throw std::runtime_error("arr3 - wrong size of data: " + std::to_string(size));
    }

    float* begin() { return data; }
    float* end() { return data + 3; }
    float& operator [](std::size_t i) { return data[i]; }
    // and similar stuff as above for const versions

private:
    float* data;
};

float newDistanceToLine(arr3_view p0, arr3_view p1, arr3_view p2);

所以 - 对于9元素阵列,我们将有这样的用法:

newDistanceToLine(arr3_view(arr, 3), 
                  arr3_view(arr + 3, 3), 
                  arr3_view(arr + 6, 3));

答案 1 :(得分:1)

改为使用数据结构。

struct SPosition
{
SPosition( float x = 0, float y = 0, float z = 0)
    :X(x)
    ,Y(y)
    ,Z(z)
{

}
float X;
float Y;
float Z;
};

std::vector<SPosition> m_positions;

float newDistanceToLine( const SPosition& pt1, const SPosition& pt2, const SPosition& pt3 )
{
    // to do
    return 0.f;
};