+92
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
I:=1;
while I<=High(Sockets) do
begin
if FD_IsSet(Sockets[I],FDSet) then
if Recv(Sockets[I],…)<=0 then
begin
// Связь разорвана, надо закрыть сокет
// и удалить его из массива
CloseSocket(Sockets[I]);
for J:=I to High(Sockets)-1 do
Sockets[J]:=Sockets[J+1];
Dec(I);
SetLength(Sockets,Length(Sockets)-1)
end
else
begin
// Получены данные от клиента, надо ответить
Send(Sockets[I],…)
end;
Inc(I)
end;
На первый взгляд может показаться странным, почему для перебора элементов массива используется цикл while, а не for. Но в дальнейшем мы увидим, что размер массива во время выполнения цикла может изменяться. Особенность же цикла for заключается в том, что его границы вычисляются один раз и запоминаются в отдельных ячейках памяти, и дальнейшее изменение значений выражений, задающих эти границы, не изменяет эти границы. В нашем примере это приведёт к тому, что в случае уменьшения массива цикл for не остановится на реальной уменьшившейся длине, а продолжит цикл по уже не существующим элементам, что приведёт к трудно предсказуемым последствиям. Поэтому в данном случае лучше использовать цикл while, в котором условие продолжения цикла полностью вычисляется при каждой его итерации.
Запостил:
TarasB,
09 Февраля 2011
http://91.210.216.1/Books/Программирование/Delphi/Использование сокетов в Delphi. Часть первая -стандартные сокеты.htm
а там есть глава про DNS?
ну, не вижу необходимости жонглировать массивом. Тупо занулляем, а новый вставляем в свободное место. Хаха, в дельфях нет стандартной функции типа splice?
тогда пользуйтесь такими структурами данных, как списки. Тогда удаление элемента сведется к стиранию его в порошок и забывчивости о нем соседей.
Просто зачем после каждого удаления сдвигать хвост массива, делая время работы квадратным? Почему нельзя удалять и одновременно сдвигать по одному?
Я вообще иногда пишу
или
Конечно же, крестоблядь скажет, что это говнокод или что это паскалокод, но единственная причина, по которой она это говорит - В С++ НЕТУ WITH!!!
КартаЖопы снята древними при целевом употреблении папируса
А знаете почему? Код хуево читается ну да и хуй с ним, чукча не читатель.
Самое хуевое, что отладить такой код невозможно! Нету объекта у которого смотреть свойства
1980 coding style?
За крестоблядь извини, это ложное срабатывание детектора по ненависти к with.
Ну и что-за проблема?
> вызовуться
дальше не читал
хотя "обрезать" массив не обязательно, не надо фрагментировать память
Хотя дельфийскому менеджеру памяти можно доверять.
И выделял ему память через GetMem(a, size) (памяти выделялось ровно столько, сколько надо, а не 64К).
Матрицу я задавал как динмасив динмассивов.
охренеть как сложно