From f55113756a9570a71f7b391edf99b7a1bfb41810 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Mon, 26 Aug 2024 19:01:33 +0800 Subject: [PATCH] =?UTF-8?q?vs2022=E5=B1=85=E7=84=B6=E4=B8=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81c99=E7=9A=84vla=EF=BC=88=E5=8F=AF=E5=8F=98=E9=95=BF?= =?UTF-8?q?=E6=95=B0=E7=BB=84=EF=BC=89=EF=BC=8C=E5=8F=AA=E5=A5=BD=E5=81=9A?= =?UTF-8?q?=E4=BA=86=E4=B8=80=E4=B8=8B=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E3=80=82=E6=8F=90=E9=AB=98=E4=B8=80=E4=B8=8B=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heap.c | 37 ++++++++++++++++++++++++++----------- test/test_tree.c | 8 ++++++++ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/heap.c b/src/heap.c index f6c1bb7..ec84537 100644 --- a/src/heap.c +++ b/src/heap.c @@ -46,11 +46,25 @@ bool heap_peek(struct _heap* self, void* obj) static void heap_swap(struct _heap* self, int i, int j) { assert(self != NULL); + assert(self->_obj_size != 0); +// #define C99_VLA +#ifdef C99_VLA char tmp[self->_obj_size]; +#else + char* tmp = malloc(self->_obj_size); + if (tmp == NULL) + { + return; + } +#endif - memmove(tmp, self->obj + i * self->_obj_size, self->_obj_size); - memmove(self->obj + i * self->_obj_size, self->obj + j * self->_obj_size, self->_obj_size); - memmove(self->obj + j * self->_obj_size, tmp, self->_obj_size); + memmove(tmp, (char *)self->obj + i * self->_obj_size, self->_obj_size); + memmove((char*)self->obj + i * self->_obj_size, (char*)self->obj + j * self->_obj_size, self->_obj_size); + memmove((char*)self->obj + j * self->_obj_size, tmp, self->_obj_size); + +#ifndef C99_VLA + free(tmp); +#endif } static void heap_fixed_up(struct _heap* self, int i) @@ -63,7 +77,7 @@ static void heap_fixed_up(struct _heap* self, int i) { p = parent(i); // 若当前节点大于其父节点,则交换位置,否则退出循环 - if(p < 0 || self->compare(self->obj + i * self->_obj_size, self->obj + p * self->_obj_size) <= 0) + if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) <= 0) { break; } @@ -77,7 +91,7 @@ static void heap_fixed_up(struct _heap* self, int i) { p = parent(i); // 若当前节点大于其父节点,则交换位置,否则退出循环 - if(p < 0 || self->compare(self->obj + i * self->_obj_size, self->obj + p * self->_obj_size) >= 0) + if(p < 0 || self->compare((char *)self->obj + i * self->_obj_size, (char *)self->obj + p * self->_obj_size) >= 0) { break; } @@ -95,10 +109,11 @@ bool heap_push(struct _heap* self, void* obj) return false; } uint32_t index = self->size(self); - memmove(self->obj + index * self->_obj_size, obj, self->_obj_size); + memmove((char *)self->obj + index * self->_obj_size, obj, self->_obj_size); self->_size++; heap_fixed_up(self, index); + return true; } static void heap_fixed_down(struct _heap* self, int i) @@ -115,12 +130,12 @@ static void heap_fixed_down(struct _heap* self, int i) r = right(i); max = i; - if(l < self->size(self) && self->compare(self->obj + l * self->_obj_size, self->obj + max * self->_obj_size) > 0) + if(l < self->size(self) && self->compare((char *)self->obj + l * self->_obj_size, (char *)self->obj + max * self->_obj_size) > 0) { max = l; } - if(r < self->size(self) && self->compare(self->obj + r * self->_obj_size, self->obj + max * self->_obj_size) > 0) + if(r < self->size(self) && self->compare((char *)self->obj + r * self->_obj_size, (char *)self->obj + max * self->_obj_size) > 0) { max = r; } @@ -140,12 +155,12 @@ static void heap_fixed_down(struct _heap* self, int i) r = right(i); min = i; - if(l < self->size(self) && self->compare(self->obj + l * self->_obj_size, self->obj + min * self->_obj_size) < 0) + if(l < self->size(self) && self->compare((char *)self->obj + l * self->_obj_size, (char *)self->obj + min * self->_obj_size) < 0) { min = l; } - if(r < self->size(self) && self->compare(self->obj + r * self->_obj_size, self->obj + min * self->_obj_size) < 0) + if(r < self->size(self) && self->compare((char *)self->obj + r * self->_obj_size, (char *)self->obj + min * self->_obj_size) < 0) { min = r; } @@ -170,7 +185,7 @@ bool heap_pop(struct _heap* self, void* obj) heap_swap(self, 0, index); if(obj != NULL) { - memmove(obj, self->obj + index * self->_obj_size, self->_obj_size); + memmove(obj, (char *)self->obj + index * self->_obj_size, self->_obj_size); } self->_size--; heap_fixed_down(self, 0); diff --git a/test/test_tree.c b/test/test_tree.c index c36cd6e..5440c28 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -1,6 +1,14 @@ #include "test.h" +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + /** * @brief * int data[] = { 5,2,3,1,7,8,6 };