+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
TarasB 09.02.2011 16:59 # +1
http://91.210.216.1/Books/Программирование/Delphi/Использование сокетов в Delphi. Часть первая -стандартные сокеты.htm
bugmenot 09.02.2011 17:18 # +5
а там есть глава про DNS?
TarasB 09.02.2011 17:19 # 0
bugmenot 09.02.2011 17:26 # 0
Lure Of Chaos 09.02.2011 18:00 # 0
ну, не вижу необходимости жонглировать массивом. Тупо занулляем, а новый вставляем в свободное место. Хаха, в дельфях нет стандартной функции типа splice?
тогда пользуйтесь такими структурами данных, как списки. Тогда удаление элемента сведется к стиранию его в порошок и забывчивости о нем соседей.
TarasB 09.02.2011 19:23 # 0
Просто зачем после каждого удаления сдвигать хвост массива, делая время работы квадратным? Почему нельзя удалять и одновременно сдвигать по одному?
Lure Of Chaos 09.02.2011 20:08 # 0
TarasB 09.02.2011 20:14 # 0
bugmenot 09.02.2011 20:29 # 0
TarasB 09.02.2011 20:38 # −4
Я вообще иногда пишу
bugmenot 09.02.2011 20:42 # +3
TarasB 09.02.2011 21:00 # −4
StriderMan 10.02.2011 12:01 # 0
TarasB 10.02.2011 12:12 # −1
или
Конечно же, крестоблядь скажет, что это говнокод или что это паскалокод, но единственная причина, по которой она это говорит - В С++ НЕТУ WITH!!!
guest 10.02.2011 13:14 # 0
bugmenot 10.02.2011 13:25 # 0
guest 10.02.2011 13:39 # +2
bugmenot 10.02.2011 13:59 # 0
StriderMan 10.02.2011 14:22 # 0
Lure Of Chaos 10.02.2011 20:44 # 0
bugmenot 10.02.2011 20:49 # 0
TarasB 11.02.2011 10:18 # 0
StriderMan 11.02.2011 12:25 # +2
КартаЖопы снята древними при целевом употреблении папируса
StriderMan 10.02.2011 14:02 # +2
А знаете почему? Код хуево читается ну да и хуй с ним, чукча не читатель.
Самое хуевое, что отладить такой код невозможно! Нету объекта у которого смотреть свойства
bugmenot 10.02.2011 14:04 # 0
1980 coding style?
StriderMan 10.02.2011 14:12 # 0
TarasB 10.02.2011 14:25 # −2
За крестоблядь извини, это ложное срабатывание детектора по ненависти к with.
StriderMan 10.02.2011 14:36 # 0
TarasB 10.02.2011 14:38 # 0
StriderMan 10.02.2011 14:09 # +3
TarasB 10.02.2011 14:25 # 0
StriderMan 10.02.2011 14:34 # +5
TarasB 10.02.2011 14:37 # −2
guest 10.02.2011 15:37 # −1
Ну и что-за проблема?
TarasB 10.02.2011 16:15 # 0
StriderMan 10.02.2011 17:04 # +1
bugmenot 10.02.2011 17:14 # +3
> вызовуться
дальше не читал
guest 10.02.2011 17:14 # −1
eth0 10.02.2011 19:41 # 0
StriderMan 10.02.2011 21:15 # 0
Lure Of Chaos 09.02.2011 20:30 # 0
хотя "обрезать" массив не обязательно, не надо фрагментировать память
bugmenot 09.02.2011 20:33 # 0
Lure Of Chaos 09.02.2011 20:36 # +2
TarasB 09.02.2011 20:36 # −2
Хотя дельфийскому менеджеру памяти можно доверять.
Lure Of Chaos 09.02.2011 20:45 # 0
TarasB 09.02.2011 21:00 # 0
И выделял ему память через GetMem(a, size) (памяти выделялось ровно столько, сколько надо, а не 64К).
Матрицу я задавал как динмасив динмассивов.
guest 09.02.2011 23:57 # 0
TarasB 10.02.2011 10:38 # 0
StriderMan 10.02.2011 10:48 # 0
Lure Of Chaos 10.02.2011 13:56 # 0
StriderMan 10.02.2011 10:26 # +1
охренеть как сложно