| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1060 人关注过本帖
标题:求助:指向函数的指针的引用
只看楼主 加入收藏
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:5 
求助:指向函数的指针的引用
正在看The C programming laugage 2nd
Brian W. Kernighan & Dennis M. Ritchie 写的。
看到《指向函数的指针》这一部分。对关于他的函数指针的引用感到非常困惑:

qsort1((void**) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ? numcmp : strcmp));

划线的部分到底是应该怎么理解呢?

请大家忙帮理解一下。

程序的目的是利用函数指针来选择根据字典顺序(strcmp)来排序,还是通过(numcmp)来排序。
原书的代码如下:
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINES 5000
char *lineptr[MAXLINES];

int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);

void qsort1(void *lineptr[], int left, int right, int (*comp)(void *, void *));
int numcmp(char *, char *);

main(int argc, char *argv[])
{
    int nlines;
    int numeric = 0;
    int (*pointertofunc)(char *, char *);

    if (argc > 1 && strcmp(argv[1], "-n") == 0)
        numeric = 1;
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
                  qsort1((void**) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ? numcmp : strcmp));
        writelines(lineptr, nlines);
        return 0;
    } else {
        printf("input too big to sort\n");
        return 1;
    }
}

void qsort1(void *v[], int left, int right, int (*comp)(void *, void *))
{
    int i, last;
    void swap(void *v[], int, int);

    if (left >= right)
        return;
    swap(v, left, (left + right)/2);
    last = left;
    for (i = left+1; i <= right; ++i)
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort1(v, left, last-1, comp);
    qsort1(v, last+1, right, comp);
}

int numcmp(char *s1, char *s2)
{
    double v1, v2;

    v1 = atof(s1);
    v2 = atof(s2);
    if (v1 < v2)
        return -1;
    else if (v1 > v2)
        return 1;
    else
        return 0;
}

void swap(void *v[], int i, int j)
{
    void *temp;

    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

我在编译出的结果报错如下:

程序代码:
xls@Debian:~/debian/code/c_programs$ cc pointer_to_function_error.c

pointer_to_function_error.c: In function ‘main’:
pointer_to_function_error.c:23: warning: pointer type mismatch in conditional expression
/tmp/ccinNKUN.o: In function `main':
pointer_to_function_error.c:(.text+0x4b): undefined reference to `readlines'
pointer_to_function_error.c:(.text+0xa1): undefined reference to `writelines'
collect2: ld returned 1 exit status



[ 本帖最后由 xiaolaoshucj 于 2011-8-10 15:54 编辑 ]
搜索更多相关主题的帖子: 函数 
2011-08-10 15:53
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:50 
(int (*)(void*,void*))(numeric ? numcmp : strcmp)

int (*)(void*,void*)这部分的的意思一种指向 参数为两个空指针 返回值为整形的函数的指针类型

numeric ? numcmp : strcmp 这个是个标记表达式吧  看一下numeric为1还是0 如果是1则返回整数类型自带的比较函数numcmp的指针

如果是0 那就返回string.h里面的strcmp函数的指针  但是前提你要包含#include <string.h>

                                         
===========深入<----------------->浅出============
2011-08-10 16:00
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
楼上说的没错。
但是两个连起来的
(int (*)(void*,void*))(numeric ? numcmp : strcmp)
是什么意思呢?
2011-08-10 16:22
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
我理解好像是将
numcmp或者strcmp转换为格式为int (*)(void*,void*)的函数,然后再将numcmp或着strcmp的地址传递给qsort函数中的comp指针。

不知道对不对。
2011-08-10 16:25
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
我也是这么理解的 只能理解成强制类型转化

                                         
===========深入<----------------->浅出============
2011-08-10 16:27
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
但是这样gcc会报错嘞~很晕,这个问题折磨我很久了。
2011-08-10 16:36
快速回复:求助:指向函数的指针的引用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013402 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved