未知字段的代码复用

标签 c

如果我有一个排序算法,并且我想按结构的某个字段进行排序。我基本上是在寻找参数(在本例中为 sortBy)能够确定是否比较 fieldOne 或 fieldTwo 的可能性,而无需不断检查要使用的正确字段。

void func(SomeType *arr, int length, int sortBy) {
    int i;
    for(int i = 0; i < length, i++) {
        if(sortBy == 1) {
            doSomethingTo(arr[i].fieldOne);
        }
        else if(sortBy == 2) {
            doSomethingTo(arr[i].fieldTwo);
        }
        // etc
    }
}

最佳答案

您可以观察标准 C qsort() 的内容做。它使用比较器函数对任何类型的任何数组进行排序:

void qsort(void *base, size_t nel, size_t width,
           int (*compar)(const void *v1, const void *v2));

如果v1应该排序在v2之前,则比较器函数返回负值;如果应该排序在v2之后,则比较器函数返回正值;如果在此排序下值相等,则比较器函数返回零标准。请注意,需要比较两个值;将一个值与自己的肚脐进行比较是不够的。

在您的示例中,您似乎正在对固定类型进行排序。您可以使用 qsort(),或者您可以借用比较器类型的想法,并使其适应您的排序:

void func(SomeType *arr, int length, int (*comparator)(const SomeType *v1, const SomeType *v2))
{
    ...
    int cmp = comparator(&arr[i], &arr[j]);
    ...
}

您的比较器可能是:

static int compare_fieldOne(const SomeType *v1, const SomeType *v2)
{
    if (v1->fieldOne < v2->fieldOne)
        return -1;
    else if (v1->fieldOne > v2->fieldOne)
        return +1;
    return 0;
}

如果需要进行更多比较,可以在 else if 子句后添加额外的测试对,将相等情况留到最后。

关于未知字段的代码复用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994985/

相关文章:

c - 指向函数内部定义的常量字符串的全局字符指针

c - 从不兼容的指针类型传递 arg 1 of `strcspn'

c++ - 是否可以先编译最近更改的文件?

c - 在 C 中对函数头(声明/定义)使用#define 预处理器指令是否可以?

c - 字符串末尾有奇怪的字符

c - 用户数组的大小

mysql - 如何在mysql_query中传递变量

c - Fortran `double precision` 与 C `double` 不同的任何平台?

c - 如何在 C 语言中找到字符串的平衡?

c - 来自 recvfrom 的错误