gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:11:11 26 4
gpt4 key购买 nike

所以我开始了解 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com