2013-09-23 154 views
2

這是我的問題: 我有一個結構:如何將結構成員數組作爲參數傳遞給函數?

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

這是錯誤消息:

error: request for member 'x' in 'arr', which is of non-class type 'point [(((unsigned int)(((int)n) + -0x000000001)) + 1)]'

很抱歉,如果這個問題是太愚蠢或先天存在缺陷的,事實是我是一個新手,我很願意學習儘可能多儘可能,我會非常感謝你的幫助!

+1

[避免使用'rand'。(http ://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful) – chris

+5

你應該使用'std :: sort',並且定義一個自定義的比較器。 –

+1

你不能用這種方式來切片結構(即使你可以,你不會想要的,因爲那樣會對x座標進行排序,並將它們與隨機的y座標進行排序,而不是與原來配對的y座標。) –

回答

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

然後內quicksort,嘗試比較arr[i].x

0

有你的代碼的幾個問題。
1.快速排序接受INT *,但你嘗試通過int值X
2.您嘗試通過INT但實際上你調用一個未定義的變量arr.x

你需要做的是在以語音電話形式爲& arr [i] .x,但爲了完成您想要的任務,您可能希望將整個結構作爲指針傳遞。

0

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

3

如果你總是希望通過x進行排序,那麼你可以硬編碼到排序功能,只是傳遞一個指針數組進行排序:

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

+0

的值是多少有利於爲'point'實現'operator'' – greyfade

+0

@greyfade:如果你使用'std :: sort'或者一個默認爲'std :: less'的比較器,並且你總是想要sam比較,你不介意在其他情況下定義的(<可能誤導性的)<<的含義,那麼也許。 –

+0

非常感謝!你剛剛救了我很多痛苦)),一旦我獲得了15的聲望,我會投票支持這個答案。這幫了我很多! :) –

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

其餘的是微不足道的,我認爲。

+0

我的方法太C'ish。請原諒我。 –

0

(幾乎)當你真的想傳遞一個指向對象的指針時,不要試圖通過向成員傳遞指針來愚弄系統。按照Grijesh的建議。傳遞成員會導致可怕的副作用。例如,快速排序會將所有整數排序在一起,而不管它們中哪些是X的,哪些是Y的。在較溫和的情況下,您可能會得到錯誤的比較標準,並且通常難以調試諸如不正確的指針優化等效果。如果你需要傳遞一個對象指針,只需要誠實地對待編譯器並傳遞對象指針。這裏有很少的例外,主要是在低級系統編程中,函數調用的「另一方」將無法處理對象。

相關問題