2011-11-22 83 views
-2

我是C編程新手,正在嘗試快速排序記錄數組。我不知道如果我正確地發送記錄的功能,但我的錯誤是快速排序一個記錄數組(結構)

error: conversion from "TaxRecord*" to non-scalar type "TaxRecord" requested
error: no match for "operator<" in "*(table + ((unsigned int)(((unsigned int)left) * 104u))) < pivot"

void qsort(TaxRecord table,int start,int finish); 

qsort(theEmployees[i],0,i); 

void qsort(TaxRecord table[],int start,int finish) 
{ 
    int left = start, 
    right = finish; 
    TaxRecord pivot = table[((start+finish)/2)]; 
    TaxRecord temp = table; 

    while (left < right) { 
    // find left candidate 
    while (table[left] < pivot) left++; 
    // find right candidate 
    while (table[right] > pivot) right--; 
     if (left <= right) { 
     int temp = table[left]; 
     table[left] = table[right]; 
     table[right] = temp; 
     left++; 
     right--; 
     } 
    } // while left < right 
    if (start < right) qsort(table,start,right); 
    if (left < finish) qsort(table,left,finish); 
} 
+2

標準庫實現有什麼問題? –

+2

聲明'void qsort(TaxRecord表,int start,int finish);'但實現了'void qsort(TaxRecord table [],int start,int finish);''不知道這是否是問題。另外,如果TaxRecord是一個類/結構體,那麼您必須定義<運算符以使用它。如果它是一個類,那麼我也建議你不要一直拷貝它,而是使用引用或指針 – PeterT

+1

C++解決方案將是定義<運算符,並使用一個向量和std :: sort ... – Lalaland

回答

3

1)你的函數原型與函數聲明不匹配。

void qsort(TaxRecord table,int start,int finish); 
void qsort(TaxRecord table[],int start,int finish) 

2)你看起來是一個單一的數組元素而不是數組本身。

qsort(theEmployees[i],0,i); 

3)您試圖將數組分配給單個TaxRecord變量。

TaxRecord temp = table; 

4)您嘗試使用int臨時交換時元素TaxRecord

int temp = table[left]; 
table[left] = table[right]; 
table[right] = temp; 

5)錯誤消息聽起來不存在用於您的TaxRecord類型定義operator<

我的建議:而不是固定您的代碼只需使用庫qsortstd::sort,取決於這是C還是C++。

+0

你不知道2)事實上,它可能是一個'TaxRecord **',但你可能是對的。 – PeterT

+0

@PeterT,這是我的一個假設,但變量'i'既是正確的'員工'下標和'TaxRecord'數組的大小是非常可疑的。 – Blastfurnace

+0

@Blastfurnace - 謝謝你!你指出了我的一些新手的錯誤,並且把我的大腦放在了正確的位置上,以找到更多的錯誤! TaxRecord是一個記錄數組,即typedef struct TaxRecord {...} – BKCOHEN

1

你宣佈

void qsort(TaxRecord table,int start,int finish); 

但實施

void qsort(TaxRecord table[],int start,int finish); 

而且,如果TaxRecord是一個類/結構,然後你必須定義<運算符來使用它。我也建議你不要一直複製它,而是使用引用或指針。如果你想保持純C,那麼你必須將函數指針傳遞給像這樣的比較函數:

void qsort(void *data,int start, int finish, int(*compare)(const void *, const void *));