簡體   English   中英

如何將結構的成員數組作為參數傳遞給函數?

[英]How to pass an array of members of a struct as a parameter to a function?

這是我的問題:我有一個結構:

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)]'

抱歉,如果問題太愚蠢或措辭不好,事實是我是一個新手,我真的很樂意學習更多,非常感謝您的幫助!

如果您始終希望按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

quicksort(arr,0,n-1);

然后在quicksort ,嘗試比較arr[i].x

您的代碼有一些問題。
1. quicksort接受int *,但是您嘗試傳遞int值x
2.您嘗試傳遞int,但實際上調用了一個未定義的變量arr.x

您需要做的是以&arr [i] .x的形式調用,但是要完成所需的操作,您可能希望將整個結構作為指針傳遞。

您需要傳遞arr作為參數,因為這是要排序的數組。 arr.x是沒有意義的。 您沒有將字符串"arr.x"作為參數傳遞,該參數可以某種方式解釋為對x字段進行排序-當編譯器看到此參數時,它正在尋找arrx元素,該元素不存在,如錯誤消息提示-只有arr的元素(例如arr[0] )具有x元素(作為arr[0].x訪問)。

假設這是出於學術目的(為什么您還要聲明自己的排序算法,而不是使用已使用自定義比較器實現的算法之一),則可以通過以下幾種方法來做到這一點:

排列

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
}

我寧願將該函數定義為:

 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); }  

我認為其余功能的實現都是微不足道的。

(幾乎)絕對不要在您確實想要將指針傳遞給對象時通過將指針傳遞給成員來欺騙系統。 按照Grijesh的建議去做。 通過成員會導致可怕的副作用。 例如,無論哪個是X的,哪個是Y的,quicksort都將所有整數排序在一起。 在較溫和的情況下,您可能會得到錯誤的比較標准,並且通常很難調試效果,例如錯誤的指針優化。 只要對編譯器老實說,如果需要傳遞對象指針,則傳遞對象指針。 很少有例外,主要與底層系統編程有關,在底層系統編程中,函數調用的“另一端”將無法處理該對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM