Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];
ВнизЛюди, которые пишут begin..end вокруг одного оператора Найти похожие ветки
← →
DVM © (2012-12-16 22:18) [160]Inc и Dec это и не функции или процедуры вообще в привычном понимании, это магия компилятора скорее, Inc(p) дает более оптимальный код, чем p := p + 1
← →
QAZ9 (2012-12-16 22:29) [161]
> Особенно с учетом inline?
нету инлайна в "старых" делфях
← →
Rouse_ © (2012-12-16 22:36) [162]
> QAZ9 (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях
Та шош ты так уперся :) Ну во первых есть, нужно только уметь его использовать. Во вторых не там ты ищешь :)
← →
QAZ9 (2012-12-16 22:38) [163]где в 7ке например искать?
← →
DVM © (2012-12-16 22:40) [164]
> QAZ9 (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях
Ну применительно к Inc Dec хоть есть он хоть нет его, все одно код будет вставлен по месту, никакого вызова функции то и не будет, самой функции то и нет.
Речь даже не о скорости, а о наглядности, удобстве использования. Там где все упрется в быстродействие, можно и ASM использовать.
← →
Игорь Шевченко © (2012-12-16 22:44) [165]Rouse_ © (16.12.12 22:09) [159]
> люди реализовавшие Inc/Dec/Max/Min
Я не вижу, чтобы они были реализованы как функции в одну строку.
Я про другое - в каком-то юните (по-моему, из VCL, не могу найти, не хочу врать) есть масса нелепых конструкций, повторяющих поведение сишных операторов.
← →
Игорь Шевченко © (2012-12-16 22:46) [166]DVM © (16.12.12 22:18) [160]
> Inc(p) дает более оптимальный код, чем p := p + 1
Это было давно и неправда
← →
Rouse_ © (2012-12-16 22:46) [167]
> QAZ9 (16.12.12 22:38) [163]
> где в 7ке например искать?
Открою тайну - инклуды :)
← →
Rouse_ © (2012-12-16 22:55) [168]
> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.
А вот это уже нюанс - покажешь, может и соглашусь...
← →
DVM © (2012-12-16 23:00) [169]
> Игорь Шевченко © (16.12.12 22:46) [166]
> Это было давно и неправда
да, посмотрел, действительно теперь компилятор заменяет выражения k := k + 1 на точно такой же код, какой раньше он порождал для Inc(k). Один в один.
Unit5.pas.37: inc(k, 10);
00510639 8345E80A add dword ptr [ebp-$18],$0a
Unit5.pas.52: k := k + 10;
005106E9 8345E80A add dword ptr [ebp-$18],$0a
← →
DVM © (2012-12-16 23:05) [170]
> Игорь Шевченко © (16.12.12 22:44) [165]
> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.
этот юнит случайно не для линковки какой то сишной либы типа zlib?
← →
Rouse_ © (2012-12-16 23:10) [171]
> DVM © (16.12.12 23:00) [169]
>
> > Игорь Шевченко © (16.12.12 22:46) [166]
>
>
> > Это было давно и неправда
>
> да, посмотрел, действительно теперь компилятор заменяет
> выражения k := k + 1 на точно такой же код, какой раньше
> он порождал для Inc(k). Один в один.
с адресной арифметикой INC выиграет, но на нюансах, надо найти в загашниках код который кажет данный нюанс...
← →
Игорь Шевченко © (2012-12-16 23:11) [172]DVM © (16.12.12 23:05) [170]
Нет, но явно что-то сишное переписывалось. Даже в блогах по этому модулю или связанному с ним проходились.
← →
Игорь Шевченко © (2012-12-16 23:34) [173]Дабы не слыть голословным
возможно, я натыкался на этоfunction Incr(var Arg: Integer): Integer; inline;
begin
Inc(Arg);
Result := Arg;
end;
function Decr(var Arg: Integer): Integer; inline;
begin
Dec(Arg);
Result := Arg;
end;
function IncrAfter(var Arg: Integer): Integer; inline;
begin
Result := Arg;
Inc(Arg);
end;
function DecrAfter(var Arg: Integer): Integer; inline;
begin
Result := Arg;
Dec(Arg);
end;
function C_Conditional(const Condition: Boolean; const TruePart, FalsePart: UnicodeString): UnicodeString;
begin
if Condition then
Result := TruePart
else
Result := FalsePart;
end;
C:\Program Files\Embarcadero\RAD Studio\7.0\source\database\dbxplatform.pas
причем, только в 10% эти функции используются, как функции, в 90% - как процедуры, то есть, ничем не отличаются от стандартных Inc, Dec
← →
Игорь Шевченко © (2012-12-16 23:39) [174]Оттуда же
if Hex = nil then
begin
SetLength(Hex,16);
Hex[0] := Ord("0");
Hex[1] := Ord("1");
Hex[2] := Ord("2");
Hex[3] := Ord("3");
Hex[4] := Ord("4");
Hex[5] := Ord("5");
Hex[6] := Ord("6");
Hex[7] := Ord("7");
Hex[8] := Ord("8");
Hex[9] := Ord("9");
Hex[10] := Ord("A");
Hex[11] := Ord("B");
Hex[12] := Ord("C");
Hex[13] := Ord("D");
Hex[14] := Ord("E");
Hex[15] := Ord("F");
SetLength(MethodStart,10);
MethodStart[0] := Ord("{");
MethodStart[1] := Ord(""");
MethodStart[2] := Ord("m");
MethodStart[3] := Ord("e");
MethodStart[4] := Ord("t");
MethodStart[5] := Ord("h");
MethodStart[6] := Ord("o");
MethodStart[7] := Ord("d");
MethodStart[8] := Ord(""");
MethodStart[9] := Ord(":");
SetLength(ParamsStart,10);
ParamsStart[0] := Ord(""");
ParamsStart[1] := Ord("p");
ParamsStart[2] := Ord("a");
ParamsStart[3] := Ord("r");
ParamsStart[4] := Ord("a");
ParamsStart[5] := Ord("m");
ParamsStart[6] := Ord("s");
ParamsStart[7] := Ord(""");
ParamsStart[8] := Ord(":");
ParamsStart[9] := Ord("[");
SetLength(Connect,10);
Connect[0] := Ord(""");
Connect[1] := Ord("c");
Connect[2] := Ord("o");
Connect[3] := Ord("n");
Connect[4] := Ord("n");
Connect[5] := Ord("e");
Connect[6] := Ord("c");
Connect[7] := Ord("t");
Connect[8] := Ord(""");
Connect[9] := Ord(",");
SetLength(Disconnect,13);
Disconnect[0] := Ord(""");
Disconnect[1] := Ord("d");
Disconnect[2] := Ord("i");
Disconnect[3] := Ord("s");
Disconnect[4] := Ord("c");
Disconnect[5] := Ord("o");
Disconnect[6] := Ord("n");
Disconnect[7] := Ord("n");
Disconnect[8] := Ord("e");
Disconnect[9] := Ord("c");
Disconnect[10] := Ord("t");
Disconnect[11] := Ord(""");
Disconnect[12] := Ord(",");
SetLength(Prepare,10);
Prepare[0] := Ord(""");
Prepare[1] := Ord("p");
Prepare[2] := Ord("r");
Prepare[3] := Ord("e");
Prepare[4] := Ord("p");
Prepare[5] := Ord("a");
Prepare[6] := Ord("r");
Prepare[7] := Ord("e");
Prepare[8] := Ord(""");
Prepare[9] := Ord(",");
SetLength(Parameters,15);
Parameters[0] := Ord("{");
Parameters[1] := Ord(""");
Parameters[2] := Ord("p");
Parameters[3] := Ord("a");
Parameters[4] := Ord("r");
Parameters[5] := Ord("a");
Parameters[6] := Ord("m");
Parameters[7] := Ord("e");
Parameters[8] := Ord("t");
Parameters[9] := Ord("e");
Parameters[10] := Ord("r");
Parameters[11] := Ord("s");
Parameters[12] := Ord(""");
Parameters[13] := Ord(":");
Parameters[14] := Ord("[");
SetLength(Execute,10);
Execute[0] := Ord(""");
Execute[1] := Ord("e");
Execute[2] := Ord("x");
Execute[3] := Ord("e");
Execute[4] := Ord("c");
Execute[5] := Ord("u");
Execute[6] := Ord("t");
Execute[7] := Ord("e");
Execute[8] := Ord(""");
Execute[9] := Ord(",");
SetLength(CommandClose,16);
CommandClose[0] := Ord(""");
CommandClose[1] := Ord("c");
CommandClose[2] := Ord("o");
CommandClose[3] := Ord("m");
CommandClose[4] := Ord("m");
CommandClose[5] := Ord("a");
CommandClose[6] := Ord("n");
CommandClose[7] := Ord("d");
CommandClose[8] := Ord("_");
CommandClose[9] := Ord("c");
CommandClose[10] := Ord("l");
CommandClose[11] := Ord("o");
CommandClose[12] := Ord("s");
CommandClose[13] := Ord("e");
CommandClose[14] := Ord(""");
CommandClose[15] := Ord(",");
SetLength(ReaderClose,15);
ReaderClose[0] := Ord(""");
ReaderClose[1] := Ord("r");
ReaderClose[2] := Ord("e");
ReaderClose[3] := Ord("a");
ReaderClose[4] := Ord("d");
ReaderClose[5] := Ord("e");
ReaderClose[6] := Ord("r");
ReaderClose[7] := Ord("_");
ReaderClose[8] := Ord("c");
ReaderClose[9] := Ord("l");
ReaderClose[10] := Ord("o");
ReaderClose[11] := Ord("s");
ReaderClose[12] := Ord("e");
ReaderClose[13] := Ord(""");
ReaderClose[14] := Ord(",");
SetLength(ResultStart,11);
ResultStart[0] := Ord("{");
ResultStart[1] := Ord(""");
ResultStart[2] := Ord("r");
ResultStart[3] := Ord("e");
ResultStart[4] := Ord("s");
ResultStart[5] := Ord("u");
ResultStart[6] := Ord("l");
ResultStart[7] := Ord("t");
ResultStart[8] := Ord(""");
ResultStart[9] := Ord(":");
ResultStart[10] := Ord("[");
SetLength(ErrorStart,17);
ErrorStart[0] := Ord("{");
ErrorStart[1] := Ord(""");
ErrorStart[2] := Ord("e");
ErrorStart[3] := Ord("r");
ErrorStart[4] := Ord("r");
ErrorStart[5] := Ord("o");
ErrorStart[6] := Ord("r");
ErrorStart[7] := Ord(""");
ErrorStart[8] := Ord(":");
ErrorStart[9] := Ord("{");
ErrorStart[10] := Ord(""");
ErrorStart[11] := Ord("n");
ErrorStart[12] := Ord("a");
ErrorStart[13] := Ord("m");
ErrorStart[14] := Ord("e");
ErrorStart[15] := Ord(""");
ErrorStart[16] := Ord(":");
SetLength(CodeLabel,7);
CodeLabel[0] := Ord(""");
CodeLabel[1] := Ord("c");
CodeLabel[2] := Ord("o");
CodeLabel[3] := Ord("d");
CodeLabel[4] := Ord("e");
CodeLabel[5] := Ord(""");
CodeLabel[6] := Ord(":");
SetLength(MessageLabel,10);
MessageLabel[0] := Ord(""");
MessageLabel[1] := Ord("m");
MessageLabel[2] := Ord("e");
MessageLabel[3] := Ord("s");
MessageLabel[4] := Ord("s");
MessageLabel[5] := Ord("a");
MessageLabel[6] := Ord("g");
MessageLabel[7] := Ord("e");
MessageLabel[8] := Ord(""");
MessageLabel[9] := Ord(":");
SetLength(NullValue,4);
NullValue[0] := Ord("n");
NullValue[1] := Ord("u");
NullValue[2] := Ord("l");
NullValue[3] := Ord("l");
SetLength(TrueValue,4);
TrueValue[0] := Ord("t");
TrueValue[1] := Ord("r");
TrueValue[2] := Ord("u");
TrueValue[3] := Ord("e");
SetLength(FalseValue,5);
FalseValue[0] := Ord("f");
FalseValue[1] := Ord("a");
FalseValue[2] := Ord("l");
FalseValue[3] := Ord("s");
FalseValue[4] := Ord("e");
...
end;
← →
GEN++ © (2012-12-16 23:40) [175]Пусть я n! раз тормоз прогресса и заклятый враг программистов
все времен и народов - но ставить begin ... end даже на один оператор
буду!!!!!
← →
DVM © (2012-12-16 23:55) [176]
> Игорь Шевченко © (16.12.12 23:34) [173]
> function C_Conditional(const Condition: Boolean; const TruePart,
> FalsePart: UnicodeString): UnicodeString;
а вот такого плана функция на мой взгляд часто бывает полезна, другое ее название IIF и для разных типов перегруженные ее варианты. Помогает сильно сократить запись, например при формировании строки подключения ADO к серверу.
> Игорь Шевченко © (16.12.12 23:39) [174]
а это какая то жесть, зачем так было делать мне не очень понятно. Оно и не наглядно и длинно. Как будто кто-то для теста по быстрому написал и так оно и осталось.
← →
Игорь Шевченко © (2012-12-17 00:01) [177]DVM © (16.12.12 23:55) [176]
> а вот такого плана функция на мой взгляд часто бывает полезна,
> другое ее название IIF и для разных типов перегруженные
> ее варианты. Помогает сильно сократить запись, например
> при формировании строки подключения ADO к серверу.
Расстреливать из ржавого пистолета за такое применение. Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов, даже тех, которые по условию не будут нужны, во-вторых, код становится непонятнее.
Что делается в этой строке ? (indy)
StreamWrite(AStream, iif(HeadContent <> "", HeadContent));
← →
Игорь Шевченко © (2012-12-17 00:02) [178]DVM © (16.12.12 23:55) [176]
> а это какая то жесть
целиком код не влез, там еще сотня строк такого же плана
← →
DVM © (2012-12-17 00:07) [179]
> Игорь Шевченко © (17.12.12 00:01) [177]
> Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов,
> даже тех, которые по условию не будут нужны
ну это критично редко бывает
> во-вторых, код становится непонятнее.
Есть такое. Но все равно, на мой взгляд удобно с ней.
>
> Что делается в этой строке ? (indy)
>
> StreamWrite(AStream, iif(HeadContent <> "", HeadContent));
>
>
>
а где еще один параметр у iif ?
← →
Игорь Шевченко © (2012-12-17 00:18) [180]DVM © (17.12.12 00:07) [179]
А почему должно быть несколько параметров ?
Я привел код, источник
C:\Program Files\Embarcadero\RAD Studio\7.0\source\IntraWeb\iwtemplateprocessorwap.pas
еще пример (не из indy)
for I := 0 to S.Count - 1 do
writeln(T, Format(" ""%s""%s", [S[I], IIF(S.Count - 1 - I,
0, "", "||CHR(13)||CHR(10)||")]));
сколько времени потребуется, чтобы понять смысл действий ?
← →
DVM © (2012-12-17 00:28) [181]
> Игорь Шевченко © (17.12.12 00:18) [180]
> DVM © (17.12.12 00:07) [179]
>
> А почему должно быть несколько параметров ?
А какой смысл когда параметров только 2 (условие и один из вариантов)?
Ну обычно IIF(условие, результат при ИСТИНА, результат при ЛОЖНО): тип результата;
Я только за такой вариант.
> for I := 0 to S.Count - 1 do
> writeln(T, Format(" ""%s""%s", [S[I], IIF(S.
> Count - 1 - I,
> 0, "", "||CHR(13)||CHR(10)||")]));
>
> сколько времени потребуется, чтобы понять смысл действий
> ?
Кому как, это дело привычки, если знать доподлинно, что делает IIF тому понятно, остальным нет.
А вообще мудрено написано. В си стиле я бы даже сказал.
← →
Игорь Шевченко © (2012-12-17 00:36) [182]DVM © (17.12.12 00:28) [181]
> А какой смысл когда параметров только 2 (условие и один
> из вариантов)?
Смотрим потроха indy и видим несколько объявлений:
function iif(ATest: Boolean; const ATrue: Integer; const AFalse: Integer): Integer; overload;
function iif(ATest: Boolean; const ATrue: string; const AFalse: string = ""): string; overload; { do not localize }
function iif(ATest: Boolean; const ATrue: Boolean; const AFalse: Boolean): Boolean; overload;
Я сам в таком же недоумении был - как это, iif и два параметра ?
а стандартная конструкция if then else не может быть overload, поэтому всегда понятна :)
Я все к одному - если код подобных субгениев не приходилось бы сопровождать - пусть себе пишут, как хотят.
← →
Германн © (2012-12-17 02:12) [183]А в результате весь спор свёлся к тому, что давно уже очевидно:
Borland/CodeGear/Embarkadero собирают весь "мусор", если он бесплатный.
Ну или его можно купить со скидкой.
← →
RGV © (2012-12-17 05:09) [184]я пишу так
case day of
1: FeedCat("Мурзик");
2: begin
FeedCat("Масяня");
FeedCat("Мурзик");
end;
else FeedAllCats;
end;
try getObject(obj) except DoSomething end;
← →
TUser © (2012-12-17 07:04) [185]у iif 4 параметра?
IIF(
S.Count - 1 - I,
0,
"",
"||CHR(13)||CHR(10)||")
← →
DVM © (2012-12-17 10:14) [186]
> TUser © (17.12.12 07:04) [185]
> у iif 4 параметра?
да их там хоть 100 сделать можно, тогда он CASE подобным становится.
← →
QAZ9 (2012-12-17 10:16) [187]
> Открою тайну - инклуды :)
мдаааа ,так и думал что про них вспомнишь
и как ты себе это представляеш?
например x:=x+1; помещенный в иклюд каким местом мне применить для y ?
← →
RWolf © (2012-12-17 10:35) [188]
> [180]
> for I := 0 to S.Count - 1 do
> writeln(T, Format(" ""%s""%s", [S[I], IIF(S.
> Count - 1 - I, 0, "", "||CHR(13)||CHR(10)||")]));
>
этот код непрозрачен не из-за IIF, а из-за кривой записи.
for I := 0 to S.Count - 1 do
begin
arg := IIF(S.Count - 1 - I, 0,
"",
"||CHR(13)||CHR(10)||");
writeln(T, Format(" ""%s""%s", [S[I], arg]));
end;
← →
Дмитрий С © (2012-12-17 10:37) [189]
> например x:=x+1; помещенный в иклюд каким местом мне применить
> для y ?
{$I include_begin.inc}y{$I include_middle.inc}1{$I include_end.inc} :)
← →
Rouse_ © (2012-12-17 10:38) [190]
> QAZ9 (17.12.12 10:16) [187]
>
> > Открою тайну - инклуды :)
>
> мдаааа ,так и думал что про них вспомнишь
А зачем x := x + 1 в инклуд то помещать, когда есть Inc? :)
В остальных случаях соблюдаются определенные правила.
← →
QAZ9 (2012-12-17 10:43) [191]
> А зачем x := x + 1 в инклуд то помещать
это минимальный гипотетический пример на твой гипотетический ответ
> Дмитрий С © (17.12.12 10:37) [189]
а содержимое этих самых файлов?
и кстати по любому проще повторить 100500 раз нужный код в разных местах чем инклюдить или и тут поспорим ?
← →
DVM © (2012-12-17 11:22) [192]
> QAZ9 (17.12.12 10:43) [191]
> и кстати по любому проще повторить 100500 раз нужный код
> в разных местах
Проще функцию сделать, чем повторять код 100500 раз в нужных местах. А накладные расходы на вызов функции как правило в обычном коде не заметны, если только функция не вызывается в цикле миллионы раз.
← →
QAZ9 (2012-12-17 11:35) [193]
> DVM © (17.12.12 11:22) [192]
неспорю :)
но батонокидатели обожают такие функции пихать в циклы миллиоразные :)
типа чем меньше букв тем оптимизированней код
← →
Игорь Шевченко © (2012-12-17 11:53) [194]RWolf © (17.12.12 10:35) [188]
А чем вариант
for I := 0 to S.Count - 1 do
if I <> S.Count - 1 then //Не последняя строка
writeln(T, Format(" ""%s""||CHR(13)||CHR(10)||", [S[I]]))
else
writeln(T, Format(" ""%s""", [S[I]]));
менее прозрачен ?
← →
RWolf © (2012-12-17 11:56) [195]
> [194]
ничем, лично я так и написал бы.
← →
RWolf © (2012-12-17 11:58) [196]впрочем, вру, я написал бы
writeln(T, " """, S[I], ""||CHR(13)||CHR(10)||")
;)
← →
Sha © (2012-12-17 12:32) [197]> Игорь Шевченко © (17.12.12 11:53) [194]
Я бы и этот вариант развернул.
Спрашивается, нафига там формат, а не обычное сцепление?
P.S.
Сейчас как раз ковыряю корпоративный софт.
Настоящее лекарство от альцгеймера:
ребусы, кроссворды, анекдоты рядом не стояли.
← →
Компромисс1 (2012-12-17 12:47) [198]Кстати, всегда раздражал код вида
for I := 0 to S.Count - 1 do
if I <> S.Count - 1 then //Не последняя строка
writeln(T, Format(" ""%s""||CHR(13)||CHR(10)||", [S[I]]))
else
writeln(T, Format(" ""%s""", [S[I]]));
так и хочется его заменить на
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;
← →
Компромисс1 (2012-12-17 12:47) [199]Кстати, всегда раздражал код вида
for I := 0 to S.Count - 1 do
if I <> S.Count - 1 then //Не последняя строка
writeln(T, Format(" ""%s""||CHR(13)||CHR(10)||", [S[I]]))
else
writeln(T, Format(" ""%s""", [S[I]]));
так и хочется его заменить на
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;
← →
Игорь Шевченко © (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 2 3 4 5 6 вся ветка
Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];
Память: 0.84 MB
Время: 0.02 c