From de090b21505e09af9902c8f60027d283a339acc1 Mon Sep 17 00:00:00 2001 From: SalientArc Date: Sat, 3 Jun 2023 00:46:44 +0530 Subject: [PATCH 1/3] [issue-fix] remove compiler warning for typedef'ed generic compare function and its specific implementation --- main.c | 63 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/main.c b/main.c index 96ecf5a..e7a91a4 100644 --- a/main.c +++ b/main.c @@ -1,35 +1,56 @@ #include #include +#include +#include #include "node.h" #include "list.h" +typedef struct Person +{ + char *name; + int age; +} Person; + +// define compare_item_func_t as a function pointer type +typedef _Bool (*compare_item_func_t)(void *, void *); + +// declare the compare_person function +_Bool compare_person(Person *person1, Person *person2); + +// a wrapper function for compare_person that has the required signature +_Bool compare_person_wrapper(void *item1, void *item2) +{ + return compare_person((Person *)item1, (Person *)item2); +} + +#define NUM_ITEM_TYPES 1 +#define ITEM_TYPE_PERSON 0 // define ITEM_TYPE_PERSON with the appropriate value + +// define compare_item_func_list as a global variable +compare_item_func_t compare_item_func_list[NUM_ITEM_TYPES] = {0}; + void create_node_tc(void) { Node *node = create_node(); assert(NULL != node); char *node_data = "kei senpai"; - fill_node_data(node, strlen(node_data)+1, node_data); + fill_node_data(node, strlen(node_data) + 1, node_data); char *saved_node_data = (char *)get_node_data(node); - + assert(NULL != saved_node_data); assert(strlen(node_data) == strlen(saved_node_data)); assert(0 == strncmp(saved_node_data, node_data, strlen(node_data))); - + destroy_node(node); } -typedef struct Person { - char* name; - int age; -} Person; - -static void free_person_name(Person* person) +static void free_person_name(Person *person) { - if(person) + if (person) { - if(person->name) + if (person->name) { free(person->name); person->name = NULL; @@ -37,15 +58,21 @@ static void free_person_name(Person* person) } } -static void* user_node_data_free_func(void* item) +static void *user_node_data_free_func(void *item) { - free_person_name((Person*)item); + free_person_name((Person *)item); return NULL; } +_Bool compare_person(Person *person1, Person *person2) +{ + // compare persons based on some criteria (here: compare by age) + return person1->age < person2->age; +} + void create_list_tc(void) { - Head* head = create_list(); + Head *head = create_list(); assert(NULL != head); Person person_list[] = { @@ -60,8 +87,8 @@ void create_list_tc(void) {.name = strdup("Kelvin"), .age = 12}, }; - uint8_t person_list_len = sizeof(person_list)/sizeof(person_list[0]); - for(uint8_t i = 0; i < person_list_len; i++) + uint8_t person_list_len = sizeof(person_list) / sizeof(person_list[0]); + for (uint8_t i = 0; i < person_list_len; i++) { append_to_list(head, sizeof(Person), &person_list[i]); } @@ -69,6 +96,10 @@ void create_list_tc(void) assert(person_list_len == count_nodes(head)); set_user_data_free_func(user_node_data_free_func); + + // update compare_item_func_list with the wrapper function + compare_item_func_list[ITEM_TYPE_PERSON] = compare_person_wrapper; + destroy_list(head); } From ed5bfd3617f49a5d660bf773f4b68a8519735718 Mon Sep 17 00:00:00 2001 From: "Bonito :3" Date: Sun, 4 Jun 2023 14:09:01 +0530 Subject: [PATCH 2/3] removed comment from main.c for readability --- main.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/main.c b/main.c index e7a91a4..b678e8e 100644 --- a/main.c +++ b/main.c @@ -12,22 +12,18 @@ typedef struct Person int age; } Person; -// define compare_item_func_t as a function pointer type typedef _Bool (*compare_item_func_t)(void *, void *); -// declare the compare_person function _Bool compare_person(Person *person1, Person *person2); -// a wrapper function for compare_person that has the required signature _Bool compare_person_wrapper(void *item1, void *item2) { return compare_person((Person *)item1, (Person *)item2); } #define NUM_ITEM_TYPES 1 -#define ITEM_TYPE_PERSON 0 // define ITEM_TYPE_PERSON with the appropriate value +#define ITEM_TYPE_PERSON 0 -// define compare_item_func_list as a global variable compare_item_func_t compare_item_func_list[NUM_ITEM_TYPES] = {0}; void create_node_tc(void) @@ -66,7 +62,6 @@ static void *user_node_data_free_func(void *item) _Bool compare_person(Person *person1, Person *person2) { - // compare persons based on some criteria (here: compare by age) return person1->age < person2->age; } @@ -97,7 +92,6 @@ void create_list_tc(void) set_user_data_free_func(user_node_data_free_func); - // update compare_item_func_list with the wrapper function compare_item_func_list[ITEM_TYPE_PERSON] = compare_person_wrapper; destroy_list(head); From e923fa796cf9ceb21ceb02efd388668a788f5a4f Mon Sep 17 00:00:00 2001 From: "Bonito :3" Date: Sun, 4 Jun 2023 14:16:25 +0530 Subject: [PATCH 3/3] removed wrapper function --- main.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/main.c b/main.c index b678e8e..291ff7e 100644 --- a/main.c +++ b/main.c @@ -12,19 +12,17 @@ typedef struct Person int age; } Person; -typedef _Bool (*compare_item_func_t)(void *, void *); +typedef _Bool (*compare_item_func_t)(Person *, Person *); -_Bool compare_person(Person *person1, Person *person2); - -_Bool compare_person_wrapper(void *item1, void *item2) +_Bool compare_person(Person *person1, Person *person2) { - return compare_person((Person *)item1, (Person *)item2); + return person1->age < person2->age; } #define NUM_ITEM_TYPES 1 #define ITEM_TYPE_PERSON 0 -compare_item_func_t compare_item_func_list[NUM_ITEM_TYPES] = {0}; +compare_item_func_t compare_item_func_list[NUM_ITEM_TYPES] = {compare_person}; void create_node_tc(void) { @@ -60,11 +58,6 @@ static void *user_node_data_free_func(void *item) return NULL; } -_Bool compare_person(Person *person1, Person *person2) -{ - return person1->age < person2->age; -} - void create_list_tc(void) { Head *head = create_list(); @@ -92,7 +85,7 @@ void create_list_tc(void) set_user_data_free_func(user_node_data_free_func); - compare_item_func_list[ITEM_TYPE_PERSON] = compare_person_wrapper; + compare_item_func_list[ITEM_TYPE_PERSON] = compare_person; destroy_list(head); }