[cdev] ������ 4, 135 ��.
Grigoriy A. Sitkarev
sitkarev �� komitex.ru
�� ��� 11 22:52:13 MSK 2010
��������, � �� �ӣ �������.
��������, ���-�� ��������� �������� � �������.
��������, ������� ���������:
void
parray_delete(struct parray *pa, void *ptr)
{
int i;
for(i = 0; i < pa->nelems; ++i){
if (pa->data[i] == ptr){
break;
}
}
if (i < pa->nelems){
if (i == pa->nelems - 1) {
--pa->nelems;
}
if (i < pa->nelems-1){
--pa->nelems;
memmove(pa->data + i,
pa->data + i + 1,
(pa->nelems - (i + 1))*sizeof(void *));
}
} else {
fprintf(stderr, "elems cann't delete\n");
}
}
� ����� �� �ӣ ������, �� ��� ���� ��� ������:
1. ��� ��� ��� ������� if (i == pa->nelems - 1) � ����� ����� �ģ� if (i
< pa->nelems-1) ���� ����� �� ���� �������:
if (i == pa->nelems - 1) {
--pa->nelems;
} else {
...
}
� ����� � �������� �����. � ������ ������ - ����� �� �������� ���ޣ��
���������� ��������� ��������� ������, �� �� ������� ���������
pa->nelems �� ����, � ����� ��������� �� ���� �� ������� ������ ���
�����. ����� ���� 4-� �������� � �������, ������� �� ������ 1. ����
������� �� 4-� - (1+1)=2, 4-2=2, ������� ������� ��������� �����
�������� � memmove(), �� (!!!) � ��� ��� ��� ������-�� �� 4, � 3, �.�.
�� ��������� �������� pa->nelems �� ����� �� �������. ������� ����
������� ��� (pa->nelems-i) ��� �� ������ ��������� ����� memmove().
� �ӣ ����� ���� ������������� ��� ��������� ��������, ������ ����� �
���� ������� ��� ���������� ������� �� ����-��� ������, ����� ����������
����� ��������� ������� �� �������.
� �� ������ �ݣ ��� ��������� � ���������� ���� ���������� ���������
���������, �����. ����� ��������� ����, � �ݣ ��� �������, ��� �� �����
������� � ���� ����.
--
�.�.
������ ��������� �����:
> memmove(pa->data + nth, pa->data + nth + pa->nelems - nth,
> (pa->nelems - (pa->nelems - nth))*sizeof(void *));
> nth ����������� � �� ����� ������� �� ������� �������. ������ ����������
> �����-�� nth ���������, � ������ ���������� ������ ���-��.
>
> ��� � �� ���� ������ �� �����, ������ ����� � ��������� ������ ��������� ���, ������ ��������� ����, ������ �� ����!!!
>
��������� ���������� � ������ �������� cdev