Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.14;
Скачать: CL | DM;

Вниз

Люди, которые пишут begin..end вокруг одного оператора   Найти похожие ветки 

 
Игорь Шевченко ©   (2012-12-17 15:16) [200]

Компромисс1   (17.12.12 12:47) [199]


> if S.Count > 0 then
> begin
>  for I := 0 to S.Count - 2 do
>  begin
>      writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
> [S[I]]))
>  end;
>  // последняя строка
>   writeln(T, Format("   ""%s""", [S[S.Count-1]]));
> end;


непонятно

Sha ©   (17.12.12 12:32) [197]


> Я бы и этот вариант развернул.
> Спрашивается, нафига там формат, а не обычное сцепление?
>


Кстати, да. Формат там ни к селу


> Сейчас как раз ковыряю корпоративный софт.
> Настоящее лекарство от альцгеймера:
> ребусы, кроссворды, анекдоты рядом не стояли.


Не сыпь мне соль на рану :)


 
Компромисс1   (2012-12-17 15:20) [201]

А так?

Count := S.Count;
if Count > 0 then
begin
// обработаем все элементы, кроме последнего
 for I := 0 to Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
[S[I]]))
 end;
 // теперь обработаем последний элемент
  writeln(T, Format("   ""%s""", [S[Count-1]]));
end;


 
Игорь Шевченко ©   (2012-12-17 15:27) [202]

Компромисс1   (17.12.12 15:20) [201]

Меня смущает фраза Count - 2 в обоих вариантах кода


 
vuk ©   (2012-12-17 15:31) [203]

Если так свербит из-за этого IIF, то его надо просто раскрыть в доп. переменную:


>   for I := 0 to S.Count - 1 do
>   begin
>     if i <> s.Count - 1 then
>       tmp := "||CHR(13)||CHR(10)||"
>     else
>       tmp := "";
>     writeln(T, Format("   ""%s%s", [s[i], tmp]));
>   end;

И, кстати, в данном применении этот IIF использует исключительно константы, поэтому при его использовании ничего дпоплнительно не вычисляется. А стоит ли такие конструкции применять - это дело личное и читаемость только дело привычки. А то так можно дойти и до того, что вызовы функций ведут к тому, что непонятно что в коде делается. :)


 
Kerk ©   (2012-12-17 15:34) [204]

Видел однажды такую ситуацию:

SomeVar := IIF(Obj = nil, SomeDefaultValue, Obj.ParamValue);

:)


 
Компромисс1   (2012-12-17 15:38) [205]

Тогда можно заменить Count на LastIndex

LastIndex := S.Count - 1;
if LastIndex >= 0 then
begin
// обработаем все элементы, кроме последнего
 for I := 0 to LastIndex - 1 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
[S[I]]))
 end;
 // теперь обработаем последний элемент
  writeln(T, Format("   ""%s""", [S[LastIndex]]));
end;

Сейчас вроде нет никаких -2, все логично и привычно


 
Kerk ©   (2012-12-17 15:39) [206]

Офигеть как тебе удалось все запутать :)))


 
Аббат Пиккола   (2012-12-17 15:39) [207]

У одного амеиканского автора как-то читал, что формат работает быстрее, чем "обычное сцепление" строк в Дельфи. Сам не проверял.


 
Компромисс1   (2012-12-17 15:54) [208]

Это я еще плохо запутал :) Обычно я overuse functions и vars и пишу так:
Count := S.Count;
if(Count > 0) then
begin
 ProcessAllButLast(...)
 ProcessLast(...)
end;

но данном конкретном случае я бы постарался не отличать последнюю строку от предпоследней, уменьшив длину строки на N после цикла, чтобы избавиться от ненужных разделителей строк


 
Компромисс1   (2012-12-17 15:54) [209]

Это я еще плохо запутал :) Обычно я overuse functions и vars и пишу так:
Count := S.Count;
if(Count > 0) then
begin
 ProcessAllButLast(...)
 ProcessLast(...)
end;

но данном конкретном случае я бы постарался не отличать последнюю строку от предпоследней, уменьшив длину строки на N после цикла, чтобы избавиться от ненужных разделителей строк


 
Игорь Шевченко ©   (2012-12-17 16:06) [210]

Аббат Пиккола   (17.12.12 15:39) [207]


> У одного амеиканского автора как-то читал, что формат работает
> быстрее, чем "обычное сцепление" строк в Дельфи. Сам не
> проверял.


"Не верь, хозяин, этому константинопольскому ходже".
С чего ради ему работать быстрее ?


 
O'ShinW ©   (2012-12-17 17:06) [211]

это легко проверить
вроде, так?

var
 s1, s2, s: string;
 i,j: integer;
 t1,t2: Cardinal;
begin
 {$O-}
 for j := 0 to 9 do
 begin
   t1 := GetTickCount;
   for i := 0 to 9999999 do
   begin
     s1 := "qw";
     s2 := "er" + IntToStr(1);
     s := s1 + s2;
     if s = "qwer2" then ShowMessage("мда?"); //пусть еще и к результату обратится
   end;
   t1 := GetTickCount - t1;

   t2 := GetTickCount;
   for i := 0 to 9999999 do
   begin
     s1 := "qw";
     s2 := "er" + IntToStr(1);
     s := Format("%s%s",[s1,s2]);
     if s = "qwer2" then ShowMessage("мда? ");
   end;
   t2 := GetTickCount - t2;

   mmo1.Lines.Add(Format("%d(+) %d(fmt)",[t1, t2]));
 end;
 {$O+}
end;


 
O'ShinW ©   (2012-12-17 17:09) [212]

явных предпочтений нет,
6115(+) 5569(fmt)
5788(+) 5834(fmt)
6349(+) 5897(fmt)
6022(+) 6084(fmt)
6443(+) 5709(fmt)
5835(+) 5444(fmt)
6100(+) 5616(fmt)
5647(+) 5320(fmt)
5444(+) 5866(fmt)
5897(+) 6146(fmt)

хотя в асмах там по-другому
LStrCat3 vs (Более долго что-то)


 
Игорь Шевченко ©   (2012-12-17 17:29) [213]

O"ShinW ©   (17.12.12 17:06) [211]

Ты работу со строками в Delphi себе представляешь ?


 
O'ShinW ©   (2012-12-17 17:51) [214]


> Игорь Шевченко ©   (17.12.12 17:29) [213]

честно - не очень. Надо будет посмотреть.
Знаю, что отличается от других, С-подобных


 
Аббат Пиккола   (2012-12-17 18:07) [215]

2 O"ShinW ©
А если взять строки подлиннее?


 
Студент   (2012-12-17 18:16) [216]

Kerk ©   (17.12.12 15:34) [204]

И в чем тут криминал?


 
RWolf ©   (2012-12-17 18:57) [217]


> [216]

в AV, вестимо.



Страницы: 1 2 3 4 5 6 вся ветка

Текущий архив: 2013.04.14;
Скачать: CL | DM;

Наверх




Память: 1.02 MB
Время: 0.033 c
15-1354877433
TUser
2012-12-07 14:50
2013.04.14
Судебные перспективы


15-1355337472
Игорь Шевченко
2012-12-12 22:37
2013.04.14
Люди, которые пишут begin..end вокруг одного оператора


15-1355839583
dummy_user
2012-12-18 18:06
2013.04.14
TClassList. Получить класс по названию.


2-1349379021
qwerty123
2012-10-04 23:30
2013.04.14
TreeView и системные иконки


4-1264578817
Interesting
2010-01-27 10:53
2013.04.14
Время по GMT