[cdev] задача 4, 135 гр.
jam
rg-400 на list.ru
Сб Дек 11 21:51:16 MSK 2010
Это я просто показал, что будет если выполнится условие.
Покажу на числах.
пусть у нас есть nelems = 10; nth = 2; count = 4, pa-data = 0 - для
определенности мы идем с нулевого адреса;
проходим по вашему коду
if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */
fprintf(stderr, "cann't delete range\n");
return;
}
if (count > pa->nelems - nth) /* 4 > 10 - 2 - не верно пропускам инструкции.*/
count = pa->nelems - nth;
memmove(pa->data + nth, pa->data + nth + count,
((pa->nelems - count))*sizeof(void *));
/*
memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 2));
вот тут ошибка: явно, что с 6 позиции у нас осталось только 4 элемента, а третий параметр равен 8
*/
pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 4 - тут результат правильный*/
другой случай пусть остальные такие же, а count = 15:
if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */
fprintf(stderr, "cann't delete range\n");
return;
}
if (count > pa->nelems - nth) /* 15 > 10 - 2 - верно выполняем инструкции. */
count = pa->nelems - nth;/* count = 10 - 2, т.е. count = 8*/
memmove(pa->data + nth, pa->data + nth + count,
((pa->nelems - count))*sizeof(void *));
/*
memmove(0 + 2, 0 + 2 + 8, sizeof(void*) * (10 - 8));
в этом случае мы вы получаем
memmove(2, 10, sizeof(void*) * (2));
получается, что мы выходим за пределы массива и еще хотим переставить 2 элемента, а не должны ничего переставлять.
*/
pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 8 - тут результат правильный*/
Подробная информация о списке рассылки cdev