函数调用函数的问题

mwmao861220 2009-05-24 04:28:51
void main()
{
int nlines;
int numeric = 0; //
char *lineptr[100];
int numcmp(char *,char *);
void qsort(void *lineptr[],int left,int right,
int (*comp)(void *,void *));

qsort((void **) lineptr,0,nlines - 1,//这个函数调用出错
(int (*)(void *,void *))(numeric ? numcmp : strcmp));//当numeric为0是调strcmp,为1时调用
} //numcmp,我以前没见过这么调用的

这是K&R上的一段代码,当然这只是一部分。我对他的qsort的调用方式表示怀疑,在VC下调用出错了,请问有这样的调用方式吗?,(int (*)(void *,void *))(numeric ? numcmp : strcmp));
这和qsort声明时的参数列表好像是不一致的啊,请问可以怎么样改一下来达到目的吗?
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mwmao861220 2009-05-24
  • 打赏
  • 举报
回复
qsort((void **) lineptr,0,nlines - 1,
numeric ?(int (*)(void *,void *)) numcmp : (int (*)(void *,void *))strcmp));
原来是这样调用的,这样就符合作者本意了
谢谢1楼的
goodname 2009-05-24
  • 打赏
  • 举报
回复
你在你的函数内部也声明了一个qsort,如果你的声明和库的声明不一致的话,链接器将寻找你自己的qsort实现。
因为你没有提供,所以会出链接错误。
所以此处可去掉qsort,只要包含 stdlib.h就可以。

strcmp的原型是
int strcmp(const char * _Str1, const char * _Str2);
你调用的时候可以先强制去const.

你既然使用自己的比较函数,那么应当实现它。

再就是 lineptr 需要初始化。

如上这些我都是以c++编译器为例说的。
arong1234 2009-05-24
  • 打赏
  • 举报
回复
至于怎么错就自己调试调试了
首先怀疑lineptr是不是包含合法值
mwmao861220 2009-05-24
  • 打赏
  • 举报
回复
谢谢了,原来(int(*)(void*,void*))是用来执行强制转换的啊,明白了点, 不过怎么调试的时候出错了啊
goodname 2009-05-24
  • 打赏
  • 举报
回复
void main()
{
int nlines;
int numeric = 0; //
char *lineptr[100];
int numcmp(char *,char *);

qsort((void **) lineptr,0,nlines - 1,//这个函数调用出错
(int (*)(const void *,const void *))(numeric ? numcmp : (int (*)(char *,char *))strcmp));//当numeric为0是调strcmp,为1时调用
}
int numcmp(char *,char *)
{
//你需要实现这个函数
return 0;
}
arong1234 2009-05-24
  • 打赏
  • 举报
回复
这不是调用,而是根据numeric返回一个函数指针,如果numeric为真,返回numcmp,否则返回strcmp
返回后,用(int(*)(void*,void*))进行类型强制转换,这没有什么不对的

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧