2012-01-06 69 views
3

我想用C泛型在C和通用功能

int lsearchGeneric(void *key, void *base, int n, int elemSize) 
{ 
    int i =0; 

    for(; i < n; i++) { 
     void *elemAddr = (char*) base + i * elemSize;   
     if(memcmp(key, elemAddr , elemSize) == 0) { 
      return i; 
     } 
    } 

    return -1; 
} 

该功能被称为与

char *key = strdup("w"); 
char *base = strdup("two"); 

int result = lsearchGeneric (&key, base, 3, sizeof(char)); 
printf("Position: %d\n", result); // prints -1 

我不知道我失去了什么位置来实现搜索。因为“w”是“two”中的第二个字母

对于那些(你知道你是谁)谁想知道这是否是家庭作业 - 答案是“不,它不是。我下面编程范式从iTunesU讲座”

+0

您是否试过在调试器中逐步执行程序?鉴于你正在学习这样做,你会从这里学到更多的东西,而不是从这里的答案... – 2012-01-06 04:51:09

回答

4

看起来你在你的函数调用有一个额外的&

int result = lsearchGeneric (&key, base, 3, sizeof(char)); 
          ^
         does not belong here! 

你传递的指针,而不是指针本身的地址。这里的赠品是你与两个操作数不一致:你通过了&keybase,其中一个没有&

小记:

这个 “通用” 可能无法正常工作structs that have padding。由于填充值未指定,并且可能与其他方面相同的结构不同。

+0

你发布这一刻我也想到了它:)谢谢 – JAM 2012-01-06 04:50:02

+1

其实,你对编译器的评论警告是错误的,因为函数需要''void *''。 (把'''''''''''''''''''''''''''''''''''''''''''''''''''''''''将'char **''''''''''''''''''完全有效,所以这在技术上是合法的。) – 2012-01-06 04:57:47

+0

@BrooksMoses你是对的,我虽然函数参数是'char *'而不是'void *'...修正... – Mysticial 2012-01-06 04:58:49

2

如果你在调试器中完成这一步,你会注意到的第一件事是函数内的“key”的值不是“w” - 相反,它是一些垃圾。如果仔细观察,您会注意到地址与您在主程序中检查出的地址不一样。

原因是您正在使用键值指针的地址 - &key - 而不是键值本身的地址(即key)调用您的函数。删除多余的&,它的工作原理正确。

+0

+1用于纠正我的错误并指向使用调试器。 – Mysticial 2012-01-06 05:02:02