From f320cd9027b9bee52442e8c58d2f3b2281c87bfc Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 31 Oct 2020 19:09:25 +0100 Subject: zusätzliches Argument beim binären Suchen... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arraylist.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/arraylist.c b/arraylist.c index 2d348f3..982e466 100644 --- a/arraylist.c +++ b/arraylist.c @@ -211,7 +211,8 @@ ArrayList_linearSearch(struct ArrayList *arrayList, void *key, int cmp(void *, c struct bsearchHelper_context { void *key; - int (*cmp)(void *, const T *); + int (*cmp)(void *, const T *, void *); + void *args; }; static int @@ -220,19 +221,20 @@ ArrayList_bsearchHelper(const void *ctx, const void *el) const struct bsearchHelper_context *context = ctx; const const_T_ptr * element = el; - return context->cmp(context->key, *element); + return context->cmp(context->key, *element, context->args); } bool -ArrayList_binarySearch(struct ArrayList *arrayList, void *key, int cmp(void *, const T *), size_t *loc) +ArrayList_binarySearch(struct ArrayList *arrayList, void *key, int cmp(void *, const T *, void *), void *args, size_t *loc) { assert(arrayList != NULL); assert(cmp != NULL); assert(loc != NULL); struct bsearchHelper_context context = { - .key = key, - .cmp = cmp + .key = key, + .cmp = cmp, + .args = args }; T **pos = bsearch(&context, arrayList->array, arrayList->size, sizeof(arrayList->array[0]), ArrayList_bsearchHelper); @@ -287,8 +289,10 @@ my_compare(const T *a, const T *b, void *args) } static int -my_search_compare(void *key, const T *element) +my_search_compare(void *key, const T *element, void *args) { + (void) args; + int *a = key; if ( *a < *element ) @@ -345,7 +349,7 @@ main(void) size_t loc; int dummy = 44; - if ( ArrayList_binarySearch(arrayList, &dummy, my_search_compare, &loc) ) { + if ( ArrayList_binarySearch(arrayList, &dummy, my_search_compare, NULL, &loc) ) { printf("Gefunden: %zu\n", loc); } -- cgit v1.3