| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1060 人关注过本帖
标题:求助:指向函数的指针的引用
取消只看楼主 加入收藏
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:3 
求助:指向函数的指针的引用
正在看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
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
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
但是这样gcc会报错嘞~很晕,这个问题折磨我很久了。
2011-08-10 16:36
快速回复:求助:指向函数的指针的引用
数据加载中...
 
   



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

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