[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