我的包含功能有什么问题?

时间:2013-05-22 21:37:53

标签: c data-structures map contains containskey

我正在尝试创建一个存储键值对的地图。我写了ContainsKey函数 - 如果找到密钥,则返回true其他false

我相信我的EQ声明有些不对劲,但我不知道问题是什么。有人可以查看我的代码并给我一些指导吗?

这是我的头文件“exer36.h”

#ifndef worksheet36_exer36_h
#define worksheet36_exer36_h

#ifndef DYARRAYDICTH
# define DYARRAYDICTH
/*
 dynamic array dictionary interface file
 */
# ifndef KEYTYPE
# define KEYTYPE char *
# endif
# ifndef VALUETYPE
# define VALUETYPE double
# endif


struct association {
    KEYTYPE key;
    VALUETYPE value;
};


# define TYPE struct association *
# include "exer14.h"
/* dictionary */
int dyArrayDictionaryContainsKey (struct DynArr * da, KEYTYPE key);

# endif

#endif

源文件“exer36.c”

#include <stdio.h>
#include <stdlib.h>
#include "exer36.h"

int dyArrayDictionaryContainsKey (struct DynArr *da, KEYTYPE key){

    for (int i=0; i < da->size; i++)
    {
     if (EQ(((struct association *)da->data[i])->key,key))
        return 1;
    }

    return 0;
}

头文件“exer14.h”

#ifndef worksheet14_exer14_h
#define worksheet14_exer14_h

#ifndef TYPE
#define TYPE int
#endif

# ifndef LT
# define LT(A, B) ((A) < (B))
# endif

#ifndef EQ
#define EQ(a, b) (a == b)
#endif

#endif


struct DynArr {
    TYPE *data;     /* pointer to the data array */
    int size;       /* Number of elements in the array */
    int capacity;   /* capacity ofthe array */
};


/* Dynamic Array Functions */
void initDynArr(struct DynArr *v, int capacity);
void freeDynArr(struct DynArr *v);
int sizeDynArr( struct DynArr *v);
void addDynArr(struct DynArr *v, TYPE val);
TYPE getDynArr(struct DynArr* da, int position);
void putDynArr(struct DynArr* da, int position, TYPE value);
void swapDynArr (struct DynArr* da, int i, int j);
void removeAtDyArr(struct DynArr* da, int index);

主文件

#include <stdio.h>
#include <stdlib.h>
#include "exer36.h"


int main(int argc, const char * argv[])
{

    //Create a dynamic array
    struct DynArr myArrD;
    printf("The size of myArrD should be empty (0), return: %d\n", myArrD.size);

    //Add a pair (Key = a AND Value = 1.0)
    char * a = "a";
    dyArrayDictionaryPut(&myArrD, a, 1.0);
    printf("Added one association. Size of myArrD should be 1, return: %d\n", myArrD.size);

    printf("%d\n",dyArrayDictionaryContainsKey(&myArrD, a));

    return 0;
}

2 个答案:

答案 0 :(得分:1)

我认为问题是您的KEYTYPEchar *,而您的EQ宏只是一个普通的==。当您将两个char *==进行比较时,您正在测试指针是否相等,而不是指向的值是等于。您可能希望使用strcmp中的<string.h>来比较密钥的值。

因为你的contains函数正在接受char *,并且我假设它只是用一个带引号的字符串调用(例如,dyArrayDictionaryContainsKey(myDynArr, "this is a key")),所以它可能总是返回false,因为你'重新比较指针

另外,我认为值得一提的是,尝试通过定义“模板化”你的地图是......不太理想。我建议将任意数据类型存储为void *,并让调用者将它们转换回它们放入的类型,并使用函数指针来处理比较和放大等事情。等

答案 1 :(得分:-1)

我的问题已解决。问题不在我发布的代码中。它来自程序中的另一个现有函数。