2011-11-22 39 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 *));