Una función de comparación genérica, con una condición variable -- ampo con abstract-data-type camp Relacionados El problema

A Generic Compare Function , With A Variable Condition


0
vote

problema

Español

Estoy tratando de usar la función

  List listFilter(List list , CompareFunction func);   

que, como todos ustedes saben, devuelven una lista filtrada de acuerdo con una condición específica, desde una lista determinada; la lista de param.

Aquí está la definición de Comparefunc:

  typedef int (*CompareFunc)(ListElement);   

Localement es, por supuesto, nulo *.

Actualmente estoy trabajando en un problema en el que un LIERE es un objeto que almacena información sobre una persona, mientras que la información incluye su edad.

Estoy tratando de escribir una función que agrupa una lista determinada de personas basadas en su edad, lo que obviamente puede variar, a la que estoy tratando de escribir una función que compara un nivel de llamada contra un INT, es decir, la edad de una persona contra Una categoría de edad, respectivamente, supongamos que se define así:

  bool ageIsValid(ListElement person , int ageCategory);   

y elimínelo como un parámetro para LISTFILTER. Sin embargo, el problema que he encontrado es que la definición de CompareFunc no está decidida por mí, es decir, soy el usuario de la lista ADT, por lo que no puedo pasar a AgeisValid directamente a ListFilter.

¿Existe una solución disponible que no confíe en las variables globales? , ya que está fruncido el ceño en este curso específico que actualmente estoy tomando.

Todas las respuestas serían muy apreciadas :)

Editar:

Acabo de tener una idea, y me preguntaba si funcionaba:

Definiré una función estática así:

      static List listFilterCustom(List list , int age){         static bool filterByAge(ListElement element){             /* pAge = getAgeOfPerson(element); */             return pAge == age;         }         return listFilter(list , filterByAge);      }   

I.E, definiré una función dentro del alcance de ListFiltercustom, en el que se reconoce la edad variable, excluyendo así el uso de variables globales. ¿Es esta solución válida?

Original en ingles

I'm trying to use the function

List listFilter(List list , CompareFunction func); 

which , as you all well know , returns a filtered list according to a specific condition , from a given list; the param list .

Here's the definition of CompareFunc :

typedef int (*CompareFunc)(ListElement); 

ListElement is of course void* .

I'm currently working on a problem in which a ListElement is an object that stores information regarding a person , whereas the information includes their age .

I'm trying to write a function which groups a given list of people based on their age, which can obviously vary, therefor I'm trying to write a function which compares a ListElement against an int , i.e a person's age against an age category , respectively , suppose it's defined thusly :

bool ageIsValid(ListElement person , int ageCategory); 

and pass it down as a parameter to listFilter . However, the problem that I've encountered is that CompareFunc's definition is not decided by me , i.e , I'm the user of the ADT List , so I can't pass ageIsValid directly to listFilter.

Is there an available solution which doesn't rely on global variables ? , since it's frowned upon in this specific course that I'm currently taking .

All answers would be greatly appreciated :)

EDIT :

I just had an idea , and I was wondering if it'd work :

I'll define a static function like so :

    static List listFilterCustom(List list , int age){         static bool filterByAge(ListElement element){             /* pAge = getAgeOfPerson(element); */             return pAge == age;         }         return listFilter(list , filterByAge);      } 

i.e , I'll define a function inside the scope of listFilterCustom , in which the variable age is recognized , thus excluding the use of global variables . Is this solution valid ?

     
         
         

Lista de respuestas

0
 
vote

Tendrá que modificar listFilter ; p.ej. Para aceptar un parámetro adicional con un puntero opaco:

  List listFilter(List list, CompareFunction func, void *info);   

{'Arjun': [70.0, 98.0, 63.0], 'Krishna': [67.0, 68.0, 69.0]} 0 debe modificarse en consecuencia para aceptar este indicador {'Arjun': [70.0, 98.0, 63.0], 'Krishna': [67.0, 68.0, 69.0]} 1111111 .

Puede pasar información adicional en este parámetro (por ejemplo, {'Arjun': [70.0, 98.0, 63.0], 'Krishna': [67.0, 68.0, 69.0]} 2 ) y llévelo de nuevo en su comperador.

 

You will have to modify listFilter; e.g. to accept an additional parameter with an opaque pointer:

List listFilter(List list, CompareFunction func, void *info); 

CompareFunction must be modified accordingly to accept this void * pointer.

You can than pass additional information in this parameter (e.g. &wanted_age_category) and cast it back in your comperator.

 
 
 
 

Relacionados problema

17  Árboles n-arios en c  ( N ary trees in c ) 
¿Cuál sería una implementación de un árbol N-ario en el idioma C? particular, quiero implementar un árbol n-ary, no seguir saltando, con un número no unido ...

0  Cómo conseguir mi pila ADT para mostrar su contenido  ( How to get my adt stack to show its contents ) 
Estoy tratando de crear una pila ADT para un mazo de cartas que realicen diferentes funciones a través de la interfaz. Estoy tratando de que la función Show f...

7  Traversal de los árboles: ¡comenzando en las hojas con solo los punteros de los padres?  ( Tree traversal starting at leaves with only parent pointers ) 
¿Es conceptualmente posible tener un árbol donde atravesarlo comenzando en un nodo de hoja dado (en lugar del nodo raíz) y use los punteros de los padres para...

0  Clasificación de la lista vinculada (adt priority que)  ( Sorting linked list adt priority que ) 
Estoy implementando prioridad que como una lista doblemente vinculada. Mis estructuras: typedef int kintyr; typedef struct qElem { struct qElem *prv; ...

0  Los valores de lista vinculados cambiaron cuando quiero imprimirlo  ( Linked list values changed when i want to print it ) 
Quiero imprimir mi lista doblemente vinculada. Aquí está la función void show(que *q) { que *temp; temp = q; if (q->cnt == 0) printf (...

0  Serialización de una clase abstracta con una lista que contiene tipos de objetos subclasificados mixtos  ( Serialization of an abstract class with a list containing mixed subclassed objec ) 
Tengo una clase abstracta que define la estructura de un marcador que se dibujará en un gráfico. Hay varias variantes de los artículos de puntuación. Todos el...

2  Lectura del archivo vs generando datos (Selectraje)  ( Reading from file vs generating data speedwise ) 
Estoy escribiendo un programa en C ++ que necesita generar un conjunto de puntos en el plano de coordenadas XYZ. El conjunto de puntos varía según un número ...

0  Encontrar los nodos máximos y mínimos posibles en un árbol de profundidad K y con un factor de ramificación de n  ( Finding max and min nodes possible in a tree of depth k and with a branching fac ) 
Tengo un árbol de profundidad k y factor de ramificación de n. He estado tratando de encontrar una fórmula general para: Posible número de nodos en este ár...

0  Implementando la exención de prioridad de ADT como lista vinculada, no se pueden ordenar elementos  ( Implementing adt priority que as linked list cant sort elements ) 
Estoy implementando el tipo de datos abstractos: PRECIALITY QUE, PERO NO PUEDO AVISO Cómo poner valores en el orden correcto. Mis estructuras: typedef int ...

0  No se puede agregar elementos a la lista de enlazamiento (ADT - PRECIALITY QUE) en el orden correcto  ( Cant add items to linked list adt priority que in the correct order ) 
Estoy implementando prioridad que como una lista doblemente vinculada. Mis estructuras: typedef int kintyr; typedef struct qElem { struct qElem *prv; ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos