erase() should iterate and move properly
This commit is contained in:
+18
-7
@@ -114,14 +114,25 @@ at(const Vec8_t* vec, const int idx)
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 1. Single erase (line 117-126):
|
||||
// - size-- before memmove → wrong copy size
|
||||
// - arr[iter] = 0 after memmove → zeros shifted element
|
||||
// - Result: a b \0 e f g h i j (after erasing index 2 from a b c d e f g h i j)
|
||||
// 2. Range erase (line 128-140):
|
||||
// - Bounds check uses && (should be ||)
|
||||
// - diff = iter_end - iter_start (off-by-one for inclusive range)
|
||||
// - memmove uses iter_end not iter_end+1
|
||||
// - Zeroing loop zeros wrong positions
|
||||
// - Result: a b \0 \0 g h i j (size=8, should be 7)
|
||||
|
||||
__attribute__((overloadable)) Vec8_t*
|
||||
erase(Vec8_t* vec, const int iter) {
|
||||
if(vec == nullptr) return nullptr;
|
||||
if(vec->arr == nullptr) return nullptr;
|
||||
if(iter >= vec->size) return nullptr;
|
||||
vec->size--;
|
||||
memmove(&vec->arr[iter], &vec->arr[iter + 1], (vec->size - iter) * sizeof(char));
|
||||
vec->arr[iter] = 0;
|
||||
memmove(&vec->arr[iter], &vec->arr[iter + 1], (vec->size - iter - 1) * sizeof(char));
|
||||
vec->size--;
|
||||
return vec;
|
||||
}
|
||||
|
||||
@@ -129,13 +140,13 @@ __attribute__((overloadable)) Vec8_t*
|
||||
erase(Vec8_t* vec, const int iter_start, const int iter_end) {
|
||||
if(vec == nullptr) return nullptr;
|
||||
if(vec->arr == nullptr) return nullptr;
|
||||
if(iter_start < 0 && iter_end >= vec->size) return nullptr;
|
||||
if(iter_start < 0 || iter_end >= vec->size) return nullptr;
|
||||
int diff = iter_end - iter_start;
|
||||
vec->size -= diff;
|
||||
memmove(&vec->arr[iter_start], &vec->arr[iter_end], (vec->size - 1) * sizeof(char));
|
||||
for(int i = 0; i < diff; i++) {
|
||||
vec->arr[iter_start + i] = 0;
|
||||
}
|
||||
memmove(&vec->arr[iter_start], &vec->arr[iter_end + 1], (vec->size - diff - 1) * sizeof(char));
|
||||
vec->size -= diff;
|
||||
return vec;
|
||||
}
|
||||
|
||||
@@ -233,8 +244,8 @@ main()
|
||||
}
|
||||
printf("\n");
|
||||
// print_vec(&vec);
|
||||
// vec = *erase(&vec, begin(&vec) + 2);
|
||||
vec = *erase(&vec, begin(&vec) + 2, begin(&vec) + 4);
|
||||
vec = *erase(&vec, begin(&vec) + 2);
|
||||
// vec = *erase(&vec, begin(&vec) + 2, begin(&vec) + 4);
|
||||
for (int i = 0; i < size; i++) {
|
||||
if(vec.arr[i] == 0) printf("0");
|
||||
printf("%c ", vec.arr[i]);
|
||||
|
||||
Reference in New Issue
Block a user