我正在尝试创建一个存储键值对的地图。我写了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;
}
答案 0 :(得分:1)
我认为问题是您的KEYTYPE
是char *
,而您的EQ
宏只是一个普通的==
。当您将两个char *
与==
进行比较时,您正在测试指针是否相等,而不是指向的值是等于。您可能希望使用strcmp
中的<string.h>
来比较密钥的值。
因为你的contains函数正在接受char *
,并且我假设它只是用一个带引号的字符串调用(例如,dyArrayDictionaryContainsKey(myDynArr, "this is a key")
),所以它可能总是返回false,因为你'重新比较指针。
另外,我认为值得一提的是,尝试通过定义“模板化”你的地图是......不太理想。我建议将任意数据类型存储为void *
,并让调用者将它们转换回它们放入的类型,并使用函数指针来处理比较和放大等事情。等
答案 1 :(得分:-1)
我的问题已解决。问题不在我发布的代码中。它来自程序中的另一个现有函数。