我正在尝试使用该功能
List listFilter(List list , CompareFunction func);
,众所周知,根据特定条件从给定列表返回过滤列表;参数列表。
这是CompareFunc的定义:
typedef int (*CompareFunc)(ListElement);
ListElement当然是void *。
我目前正在解决一个问题,其中ListElement是一个存储有关某人的信息的对象,而该信息包括他们的年龄。
我正在尝试编写一个函数,根据年龄对给定的人员列表进行分组,这显然会有所不同,因此我正在尝试编写一个函数,将ListElement与int进行比较,即一个人的年龄与一个年龄类别,分别假设它是如此定义的:
bool ageIsValid(ListElement person , int ageCategory);
并将其作为参数传递给listFilter。 但是,我遇到的问题是CompareFunc的定义不是由我决定的,即我是ADT列表的用户,所以我不能将ageIsValid直接传递给listFilter。
是否有可用的解决方案不依赖于全局变量? ,因为在我正在参加的这个特定课程中,它不受欢迎。
非常感谢所有答案:)
编辑:
我刚才有了一个想法,我想知道它是否有效:
我将定义一个静态函数:
static List listFilterCustom(List list , int age){
static bool filterByAge(ListElement element){
/* pAge = getAgeOfPerson(element); */
return pAge == age;
}
return listFilter(list , filterByAge);
}
即,我将在listFilterCustom范围内定义一个函数,其中可识别变量age,从而排除全局变量的使用。 这个解决方案有效吗?
答案 0 :(得分:0)
您必须修改listFilter
;例如接受带有不透明指针的附加参数:
List listFilter(List list, CompareFunction func, void *info);
必须相应地修改 CompareFunction
以接受此void *
指针。
您可以在此参数中传递其他信息(例如&wanted_age_category
)并将其强制转换回您的编译器。