here is my sort algorithm:
Code:// ---------------------------------------------------------------- // Name: QuickSort // Description: quicksorts the array // Arguments: p_array: the array to sort // p_first: first index of the segment to sort // p_size: size of the segment // p_compare: comparison function // Return Value: None // ---------------------------------------------------------------- template<class DataType> void QuickSort( vector<DataType>& p_array, int p_first, int p_size, int (*p_compare)(DataType, DataType) ) { DataType pivot; int last = p_first + p_size - 1; // index of the last cell int lower = p_first; // index of the lower cell int higher = last; // index of the upper cell int mid; // index of the median value // if the size of the array to sort is greater than 1, then sort it. if( p_size > 1 ) { // find the index of the median value, and set that as the pivot. mid = FindMedianOfThree( p_array, p_first, p_size, p_compare ); pivot = p_array[mid]; // move the first value in the array into the place where the pivot was p_array[mid] = p_array[p_first]; // while the lower index is lower than the higher index while( lower < higher ) { // iterate downwards until a value lower than the pivot is found while( p_compare( pivot, p_array[higher] ) < 0 && lower < higher ) higher--; // if the previous loop found a value lower than the pivot, // higher will not equal lower. if( higher != lower ) { // so move the value of the higher index into the lower index // (which is empty), and move the lower index up. p_array[lower] = p_array[higher]; lower++; } // now iterate upwards until a value greater than the pivot is found while( p_compare( pivot, p_array[lower] ) > 0 && lower < higher ) lower++; // if the previous loop found a value greater than the pivot, // higher will not equal lower if( higher != lower ) { // move the value at the lower index into the higher index, // (which is empty), and move the higher index down. p_array[higher] = p_array[lower]; higher--; } } // at the end of the main loop, the lower index will be empty, so // put the pivot in there. p_array[lower] = pivot; // recursively quicksort the left half QuickSort( p_array, p_first, lower - p_first, p_compare ); // recursively quicksort the right half. QuickSort( p_array, lower + 1, last - lower, p_compare ); } }
now i got this working before with one of my classes
before the class i decared this function:
then a member of my class uses the QuickSort (look at the bottom bit):Code://use quick sort to keep windows drawn in the proper order // compare the y values only. int CompareZ( cBaseWindow* l, cBaseWindow* r ) { if (l->getZ() == r->getZ() ) { if( l->getZ() < r->getZ() ) return 1; if( l->getZ() > r->getZ() ) return -1; } if( l->getZ() < r->getZ() ) return -1; if( l->getZ() > r->getZ() ) return 1; return 0; }
and this all worked fine,Code:void cGUIManager::GUIMouseDown(float x, float y) { int tmpZ = WindowList.size()+1; for (unsigned int iloop=0;iloop<WindowList.size();iloop++) { if (WindowList[iloop]->MouseTest(x,y)) { if(WindowList[iloop]->getZ()<tmpZ && WindowList[iloop]->getVisible()==true && WindowList[iloop]->getEnabled()) { tmpZ=WindowList[iloop]->getZ() ; ClearFocus(); WindowList[iloop]->SetFocus(); WindowList[iloop]->MouseDown(x,y); } } } if (tmpZ > 0 && tmpZ<WindowList.size()+1) { //Brought a window to the front so reorder the others down one for (unsigned int iloop=0;iloop<WindowList.size();iloop++) { WindowList[iloop]->Reorder(tmpZ); } //Resort the List for the New Order QuickSort(WindowList,0,WindowList.size(),CompareZ); } };
then i decided that i wanted to have the CompareZ function as a member of the class.
so i did this:
and this:Code:int cGUIManager::CompareZ( cBaseWindow* l, cBaseWindow* r ) { if (l->getZ() == r->getZ() ) { if( l->getZ() < r->getZ() ) return 1; if( l->getZ() > r->getZ() ) return -1; } if( l->getZ() < r->getZ() ) return -1; if( l->getZ() > r->getZ() ) return 1; return 0; }
but it did not work, i got the following error:Code:void cGUIManager::GUIMouseDown(float x, float y) { int tmpZ = WindowList.size()+1; for (unsigned int iloop=0;iloop<WindowList.size();iloop++) { if (WindowList[iloop]->MouseTest(x,y)) { if(WindowList[iloop]->getZ()<tmpZ && WindowList[iloop]->getVisible()==true && WindowList[iloop]->getEnabled()) { tmpZ=WindowList[iloop]->getZ() ; ClearFocus(); WindowList[iloop]->SetFocus(); WindowList[iloop]->MouseDown(x,y); } } } if (tmpZ > 0 && tmpZ<WindowList.size()+1) { //Brought a window to the front so reorder the others down one for (unsigned int iloop=0;iloop<WindowList.size();iloop++) { WindowList[iloop]->Reorder(tmpZ); } //Resort the List for the New Order QuickSort(WindowList,0,WindowList.size(),cGUIManager::CompareZ); } };
it seems the quick sort algorithm did not like accepting cGUIManager::CompareZ as a comparision function to use, but i am not sure why, or what i can to to make it accept the classes member function..Code:no matching function for call to `QuickSort(std::vector<cBaseWindow*, std::allocator<cBaseWindow*> >&, int, size_t, <unknown type>)'
any help will be greatly appriciated![]()



LinkBack URL
About LinkBacks




