erJSu 2024-05-13 20:04 采纳率: 80%
浏览 2
已结题

指针函数要不要声明原型


​
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

/** Our old friend die from ex17. */
void die(const char *message)
{
    if (errno) {
        perror(message);
    } else {
        printf("ERROR: %s\n", message);
    }

    exit(1);
}

//a typedef creates a fake type, int this
// case for a function pointer
typedef int (*compare_cb) (int a, int b);

/**
 *
 * A classsic bubble sort function that uses the
 * compare_cb to  do the sorting.
 */
int *bubble_sort(int *numbers, int count, compare_cb cmp)
{
    int temp = 0;
    int i = 0;
    int j = 0;
    int *target = malloc(count * sizeof(int));

    if (!target)
        die("Memory error.");

    memcpy(target, numbers, count *sizeof(int));

    for (i = 0; i < count; i++) {
        for (j = 0; j < count -1; j++) {
            if (cmp(target[j], target[j + 1]) > 0) {
                temp = target[j +1];
                target[j +1] = target[j];
                target[j] = temp;
            }
        }
    }

    printf("I:%d J:%d\n",i, j);
    return target;
}

int sorted_order(int a, int b)
{
    return a - b;
}

int reverse_order(int a, int b)
{
    return b - a;
}

int strange_order(int a, int b)
{
    if (a == 0 || b == 0) {
        return 0;
    }else {
        return a % b;
    }
}

/**
 * Used to test that we are sorting things correctly
 * by doing the sort and printging it out;
 */
void test_sorting(int *numbers, int count, compare_cb cmp)
{
    int i = 0;
    int *sorted = bubble_sort(numbers, count, cmp);

    if (!sorted)
        die("Failed to sort as requested.");

    for ( i = 0; i < count; i++) {
        printf("%d ", sorted[i]);
    }
    printf("\n");

    free(sorted);
}

int main(int argc, char *argv[])
{
    if (argc < 2) die("USAGE: ./ex18 4 3 1 5 6");
    int count = argc - 1;//except ./ex18
    int i = 0;
    char **inputs = argv + 1;//cha 1

    int *numbers = malloc(count *sizeof(int));
    if (!numbers)
               die("Memory error.");

    for (i = 0; i < count; i++) {
        numbers[i] = atoi(inputs[i]);
    }

    test_sorting(numbers, count, sorted_order);
    test_sorting(numbers, count, reverse_order);
    test_sorting(numbers, count, strange_order);

    free(numbers);

    return 0;
}

 

​

此段代码是不是定义了指针函数却没有声明函数原型,还是说有三个声明?难道不应该是定义好后就声明原型吗?

  • 写回答

5条回答 默认 最新

  • 笑面虎 2024-05-13 20:04
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    您的提问目的是要确认在C语言中,是否需要为指针函数声明原型,以及在提供的代码示例中是否存在这个问题。

    问题出现原因:

    在C语言中,函数指针是一种指向函数的指针变量。当您定义一个函数指针类型时,您实际上是在创建一个新的数据类型,这个类型可以指向任何具有匹配签名的函数。在您提供的代码中,compare_cb 是一个指向函数的指针类型,它指向接受两个 int 参数并返回一个 int 的函数。

    问题解决方案:

    在C语言中,您需要在使用函数指针之前声明其类型。在您的代码中,compare_cb 已经在 bubble_sort 函数之前通过 typedef 被声明了,这实际上就是一个函数原型的声明。因此,您已经有了正确的函数指针声明。

    提供代码:

    您的代码中已经包含了函数指针的声明,所以不需要额外的声明。代码如下:

    #include <stdio.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    
    // 函数指针的声明和定义
    typedef int (*compare_cb) (int a, int b);
    
    // 其他函数定义...
    
    int main(int argc, char *argv[]) {
        // 主函数实现...
        return 0;
    }
    

    代码运行方式:

    要运行您的代码,您需要一个支持C语言的编译器,如GCC或Clang。您可以在命令行中使用以下命令编译和运行您的程序:

    gcc -o ex18 ex18.c
    ./ex18 4 3 1 5 6
    

    这里 ex18.c 是您的源代码文件名,ex18 是编译后生成的可执行文件名。

    代码预期运行结果:

    如果您的代码没有错误,它将根据提供的命令行参数对整数数组进行排序,并使用不同的比较函数打印出排序后的结果。

    推荐相关链接:

    请注意,您的代码中有一些笔误,例如 memcpy 后面的 count *sizeof(int) 应该是 count * sizeof(*numbers),因为 sizeof 需要一个具体的类型,而 *numbers 表示 numbers 指向的元素的类型。此外,printf 中的 "I:%d J:%d\n" 可能不是您想要的输出,因为它会打印出排序的迭代次数,这通常不是必需的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月13日

悬赏问题

  • ¥50 微信小程序 成功包奶茶啊
  • ¥15 计算机博弈的六子棋代码
  • ¥15 在Fetch API中传送的参数为何不起作用?
  • ¥15 问题遇到的现象和发生背景 360导航页面千次ip是20元,但是我们是刷量的 超过100ip就不算量了,假量超过100就不算了 这是什么逻辑呢 有没有人能懂的 1000元红包感谢费
  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?