c - C 中的小泛型编程问题

标签 c pointers

所以我开始了解 C 中泛型编程的基础知识。我目前正在构建一个程序,用于判断给定数字序列中是否出现某个值。 我认为该错误发生在 cmpValues 函数中。有人会指点一下吗? (例如,对于want=4和v={1,2,3,4,5},程序表示want不在v中)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void *search(const void *x, const void *t, int n, int d, int (*cmpValues)(const void *, const void *)){
    char *p = (char *)t;
    int i;
    for(i=0;i<n;++i)
        if(cmpValues(x,p+i*d))
            return p+i*d;
    return NULL;
}

int cmpValues(const void *a, const void *b){
    if((char *)a == (char *)b)
        return 1;
    return 0;
}

int main() {
    FILE *f = fopen("datein.txt", "r");
    FILE *g = fopen("dateout.txt", "w");
    int *v, n, i, want;
    fscanf(f, "%d", &n);
    v = (int *)malloc(n * sizeof(int));
    for(i = 0; i < n; ++i)
        fscanf(f, "%d", v + i);
    fscanf(f, "%d", &want);
    if(search(&want, v, n, sizeof(int), cmpValues))
        fprintf(g, "The value %d is found at position %d.\n\n", want, search(&want, v, n, sizeof(int), cmpValues));
    else
        fprintf(g, "The value does bot occur in the given sequence.\n\n");
    return 0;
}

最佳答案

在 cmpValues 中,您正在比较由 2 个 void 指针指向的 2 个对象(即您不知道它们的类型,也不知道它们的大小)。假设我们有 int,并且 int 有 4 个字节,通常是这种情况。

只是为了方便起见,我们假设 a 指针的值为 0x100(即指向从 0x100 到 0x103(含)的 int),而 b 指针的值为 0x104(即指向从 0x104 到 0x107 的 int) )。

现在,您将它们转换为 char*(char 有 1 个字节)并比较指针的值。现在,指针的类型在比较中并不重要。在此比较中,您将比较内存地址(在我的示例中为 0x100 和 0x104)。显然,函数返回 1 的唯一方法是指针指向同一个变量。

现在,为了修复它,您应该比较指针指向的内存地址处的值。但是,只需取消引用指针即可:

*((char *)a) == *((char *)b)

还不够,因为这只会比较 a 的第一个字节与 b 的第一个字节(假设 char 有 1 个字节)。另外,您不能取消引用 void*。

因此,您需要迭代变量并逐字节比较它们(假设您知道数据类型的大小):

int comp(void *a, void *b, int size) {
    // convert a and b to char* (1 byte data type)
    char *ca = a;
    char *cb = b;
    // iterate over size bytes and try to find a difference
    for (int i = 0; i < size; i++) {
        if (*(ca + i) != *(cb + j)) {
            return 0;
        }
    }
    // if no difference has been found, the elements are equal
    return 1;
}

旁注:您不需要在 main 中调用 cauta 两次。

关于c - C 中的小泛型编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41899288/

相关文章:

c - getchar() 不会让控制台保持打开状态

c - 需要更改指针让我遇到问题

c++ - 类数组。栈还是堆?

c - 为什么我不能通过传入一个指针来创建一个整数?

c++ - int 和数组的指针

c++ - char* 到 const wchar_t * 转换

c++ - 如何调试非确定性内存损坏?

c++ - Gstreamer appsrc : odd behaviour of need-data callback

c - 终止指向指针的指针?

c++ - 计算位掩码,枚举 0