如何将struct的成员数组作为参数传递给函数?

时间:2013-09-23 15:34:42

标签: c++ arrays struct

这是我的问题: 我有一个结构:

struct point
{
    int x;
    int y;
};

然后我有一个数组:

for (int i = 0;i < n;i++)
{
    arr[i].x=rand() % n + 1;
}

我将quicksort函数定义如下:

 void quicksort(int *a, int left, int right);

我希望按X坐标对点进行排序,因此我调用quicksort

quicksort(arr.x, 0, n-1);

这是错误消息:

  

错误:请求'arr'中的成员'x',它是非类型的'point [(((unsigned int)(((int)n)+ -0x000000001))+ 1)]'< / p>

对不起,如果问题太愚蠢或制定不当,事实是我是新手,我真的愿意尽可能地学习,我非常感谢你的帮助!

7 个答案:

答案 0 :(得分:3)

如果您总是希望按x排序,那么您可以将其硬编码到sort函数中,只需将指针传递给数组即可进行排序:

void quicksort(point * arr, int left, int right) {
    // test points with 
    // if (arr[i].x < arr[j].x) {/* i sorts before j */}
}

quicksort(arr, 0, n-1);

要指定要排序的类成员,需要指向成员的指针,而不是指针;类似的东西:

void quicksort(point * arr, int point::*member, int left, int right){
    // test points with 
    // if (arr[i].*member < arr[j].*member) {/* i sorts before j */}
}

quicksort(arr, &point::x, 0, n-1);

更一般地说,您可以按照std::sort的示例接受任何比较仿函数:

template <typename RandIter, typename Compare>
void quicksort(RandIter begin, RandIter end, Compare compare) {
    // test points with 
    // if (compare(*it1, *it2)) {/* *it1 sorts before *it2 */}
}

quicksort(arr, arr+n, 
    [](point const &lhs, point const &rhs) {return lhs.x < rhs.x;});

当然,除非您正在学习如何实施排序算法,否则只需使用std::sort

答案 1 :(得分:0)

quicksort(arr,0,n-1);

然后在quicksort内,尝试比较arr[i].x

答案 2 :(得分:0)

您的代码存在一些问题 1. quicksort接受int *但你尝试传递int值x
2.您尝试传递int但实际上调用了未定义的变量arr.x

你需要做的是以&amp; arr [i] .x的形式调用,但要完成你想要的,你可能想要将整个结构作为指针传递。

答案 3 :(得分:0)

您需要传递arr作为参数,因为这是要排序的数组。 arr.x毫无意义。您没有将字符串"arr.x"作为参数传递,该参数可以某种方式被解释为x字段上的排序 - 当编译器看到它时,它正在寻找x arr元素,如错误消息所示,不存在,只有arr(例如arr[0])的元素具有x个元素(以arr[0].x形式访问)。

答案 4 :(得分:0)

假设这是出于学术目的(为什么你会声明自己的排序算法而不是使用已经使用自定义比较器实现的算法之一?),你可以通过以下几种方式实现:

<强>阵列

std::array<point, 10> myArray; // declares an array of size 10 for points
template<size_t N>
void quicksort(std::array<point, N>& arr, ...)
{
    // implement sort operating on arr
}

<强>矢量

std::vector<point> myVector; // declares a dynamic array/vector of points
void quicksort(std::vector<point>& arr, ...)
{
    // implement sort operating on arr
}

如果出于某种可怕的原因,你想把它保存在C:

<强>旧

const size_t SIZE = 10;
point arr[SIZE]; // declare an array of 10 points
void quicksort(point* p, const size_t n, ...)
{
    // implement sort operating on elements in p passing in SIZE for n
}

答案 5 :(得分:0)

我宁愿将函数定义为:

 void quicksort(void *a,int left,int right, size_t size, int (*fp)(void*,void*));

size是数组中一个元素的大小,fp是一个比较函数,如果两个参数相等则返回true。现在您可以将函数调用为:

quicksort(arr,0,n-1,sizeof(arr)/sizeof(arr[0]), compare);

其中函数比较类似于:

int compare(void* a, void* b) { return *((int*)a) >= *((int*)b); }  

我认为其余的功能实现是微不足道的。

答案 6 :(得分:0)

(几乎)当你真的想要将指针传递给对象时,不要试图通过将指针传递给成员来欺骗系统。按照Grijesh的建议。通过会员可能会导致可怕的副作用。例如,quicksort将把所有整数排序在一起,无论它们是哪个是X,哪个是Y.在较温和的情况下,比较标准可能会出错,并且通常难以调试诸如错误指针优化之类的效果。老实说,如果需要传递对象指针,请编译并传递对象指针。非常非常少的例外,主要与低级系统编程有关,其中函数调用的“另一侧”将无法处理该对象。