gpt4 book ai didi

c - "Incompatible pointer type"qsort 第 4 个参数的编译器警告

转载 作者:太空狗 更新时间:2023-10-29 15:13:40 31 4
gpt4 key购买 nike

我正在尝试使用标准库的 qsort 对宽字符数组进行排序:

wchar_t a = L'a';
wchar_t a1 = L'ä';
wchar_t b = L'z';
wchar_t chararray[] = {b, a, a1};
length = wcslen(chararray);

qsort(chararray, length, sizeof(wchar_t), wcscoll);

现在我认为涉及的函数有这些原型(prototype):

int wcscoll(const wchar_t *ws1, const wchar_t *ws2);
void qsort(void *base, size_t num, size_t size, int (*comp_func)(const void *, const void *))

结果完全符合预期,但为什么我会收到编译器警告passing argument 4 of ‘qsort’ from incompatible pointer type?我如何转换 wcscoll 以适应原型(prototype)?

如果我定义并传入一个单独的比较函数,警告就会消失:

int widecharcomp(const void *arg1, const void *arg2)
{
return wcscoll(arg1, arg2);
}

... 但是当参数不是 wchar_t * 类型时,这个看起来应该有错误处理。

最佳答案

您的做法几乎是正确的。 The gcc documentation for strcoll and wcscoll给出了一个与此类似的示例,作为将 strcollwcscollqsort 一起使用的正确方法。

 /* This is the comparison function used with qsort. */

int
compare_elements (char **p1, char **p2)
{
return strcoll (*p1, *p2);
}

/* This is the entry point---the function to sort
strings using the locale's collating sequence. */

void
sort_strings (char **array, int nstrings)
{
/* Sort temp_array by comparing the strings. */
qsort (array, nstrings,
sizeof (char *), compare_elements);
}

这个例子实际上确实引发了你想要摆脱的警告,但同样可以通过将 char** 更改为 const void* 来绕过compare_elements 的参数,然后显式转换为 const char**

您观察到这是类型不安全的,这是正确的,但类型安全并不是 C 的强项之一。 C 没有泛型或模板之类的东西,因此 qsort 可以处理任意类型的唯一方法是它的比较函数接受 void*。程序员需要确保比较函数不在可能传递非预期类型参数的上下文中使用。

也就是说,您的代码中存在错误。比较函数接收的不是要比较的元素,而是指向要比较的元素的指针。因此,如果元素是字符串,则意味着指针到指针。所以当你写

return wcscoll(arg1, arg2);

wscoll 需要 wchar_t* 时,您实际上传递了一个 wchar_t**。在抑制警告的同时执行此操作的正确方法是:

int widecharcomp(const void *arg1, const void *arg2)
{
return wcscoll(*(const w_char_t**)arg1, *(const w_char_t**)arg2);
}

就是这么丑。

编辑:

再次查看代码的顶部。你的错误在这里真的是双重的。您正在尝试使用 wcscoll 对字符进行排序。这是一个用于对 strings 进行排序的函数(在 C 中是指向以 nul 结尾的字符序列的指针)。上面是假设您正在尝试对字符串进行排序而编写的。如果你想对字符进行排序,那么 wcscoll 不是适合使用的函数,但上面关于 qsort 的所有内容仍然适用。

关于c - "Incompatible pointer type"qsort 第 4 个参数的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3495564/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com