-1

我正在尝试创建一个映射来存储键值对。我写了一个ContainsKey函数——如果我找到密钥然后返回trueelse 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;
}
4

2 回答 2

1

我相信问题是你的KEYTYPE是一个char *,而你的EQ宏只是一个普通的旧的==。当您将两个char *与进行比较时==,您正在测试指针是否相等,而不是它们指向的值是否相等。您可能希望使用strcmpfrom<string.h>来比较键的值。

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

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

于 2013-05-22T21:51:32.157 回答
-1

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

于 2013-05-23T03:23:13.210 回答