我已经定义了一个结构数组
typedef struct sorting {
int number
} SRT;
SRT *mystr = NULL;
我后来动态分配。
我希望按number
int;
我需要写什么样的函数才能让qsort这样做?我写了:
qsort(mystr,array_index,sizeof(mystr),magic);
int magic(const void *a, const void *b) {
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
return ( one-two);
}
但它没有用。我该怎么做? 它引发了关于不命名类型的错误。
答案 0 :(得分:2)
您无法使用写入的函数对数组进行可靠的排序:
它有语法错误,其中一些是拼写错误,另一些则表示类型,结构标记和变量名称之间的混淆。
return (one - two);
仅适用于one
和two
的合理较小值。如果存在整数算术溢出,它将调用未定义的行为。例如,如果one == INT_MAX
和two == -1
,则{C}语言未指定one - two
的值,而在通用平台上,它可能会返回INT_MIN
,这是一个负值,导致错误的排序。
一个简单的解决方案就是:
int sort_function(const void *a, const void *b) {
int one = ((const SRT*)a)->number;
int two = ((const SRT*)b)->number;
return (one > two) - (one < two);
}
如果(one > two) - (one < two)
小于-1
,则表达式one
评估为two
,如果0
相等则为1
,否则为0
。在C中,如果为false,则比较评估为1
,如果为真,则评估为qsort(mystr, array_count, sizeof(*mystr), sort_function);
。
排序功能应该这样使用:
mystr
sizeof(mystr)
指向的数组中的结构数。magic
是指针的大小,而不是指向的大小。 IDocumentQuery<T> context = session.Advanced.DocumentQuery<T>();
context = AddSearchToContext(context, _searchRequest.Search, _searchRequest.DataFilters.Any());
context = AddFiltersToContext(context, _searchRequest.DataFilters);
context.Take(1).ToList();
RavenQueryStatistics stats = null;
context.Statistics(out stats);
return stats.TotalResults;
这样的神秘名称......对类型,函数和变量使用描述性名称。答案 1 :(得分:0)
两个问题:
qsort(mystr,array_index,sizeof(mystr),magic);
mystr
是指向SRT
的指针,所以你传入指向结构的指针的大小,而不是结构的大小:
qsort(mystr,array_index,sizeof(STR),magic);
然后是这个:
int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;
mystr
是变量名,而不是类型,并且myst
未在任何位置定义。你需要这里的类型名称:
int one=((const SRT *)a)->number;
int two=((const SRT *)b)->number;