Вверх ↑
Ответов: 9904
Рейтинг: 351
#1: 2020-01-03 15:04:35 ЛС | профиль | цитата
Netspirit писал(а):
Но есть ещё секция констант "только для чтения" в исполняемом файле

Да понятно все. Твой пример убедителен, хотя и не удивил аж нисколько.

Netspirit писал(а):
Но в кодогенераторе стоит костыль

Его не так просто убрать... Мне это тоже не нравилось, но в то время я не решался так глубоко лезть в наши системные файлы.
Да и не все я решал.
Во-первых, принудительное добавление нулика в хвост - это один из способов уговорить Delphi что это таки строка а не символ, для односимвольной строки.
Во-вторых, если текст длиннее 255 символов, то Delphi огорчается, и не хочет компилировать. В этом случае таковая строка помещается в соответствующую секцию ресурса, откуда возвращается только как PChar. Т.е, опять облом с нулевым символом.
Надо, видимо, помещать в ресурс также, как и Stream, с соответствующим извлечением (а это функции из share). И найти таки вариант записи для односимвольной строки.
Ну не смогла я В то время...
В общем, не все так просто.

Netspirit писал(а):
"F" для приватных полей класса

Да запросто
Замена Mask на SetMask добавила 12 символов код. Замена intMask на FMask - вернет обратно 10

Netspirit писал(а):
Скажем, я бы предпочел

А вот смотри сюда:

function _StrCmp(Str, Msk: PChar): Boolean;
begin
while (Str^ <> #0) and (Msk^ <> #0) do
begin
if Msk^ = '*' then
begin //Statement-1
Result := _StrCmp(Str, Msk + 1);
if Result then Exit;
end
else if Msk^ = '#' then
begin //Statement-2
if Str^ in ['0'..'9'] then Inc(Msk)
else Break;
end
else if (Msk^ = '?') or (Msk^ = Str^) then
//Statement-3
Inc(Msk)
else
//Statement-4
Break;
Inc(Str);
end;

while Msk^ = '*' do Inc(Msk);

Result := (Str^ = #0) and (Msk^ = #0);
end;
Модифицировал твой код самым минимальным образом (старался, между прочим).
И у меня все Statement-ы имеют одинаковый отступ.
А у тебя каждый последующий все глубже и глубже. Ну хорошо, что их всего 4... А если бы 20 ???
Вот это я и называю "лесенкой", особого семантического смысла не имеющего.
Такая комбинация ELSEIF-ов (если их записать раздельно, как else if - смысл-то от этого не меняется) - это же просто как супер-навороченный CASE.
Нас же не оскорбляет, что все его ветки на одном уровне отступа. Почему же здесь мы должны обижаться...
Netspirit, я не спорю, у тебя все канонически правильно. Просто пойми, что в мой подход тоже системен и логичен.
Вот и все.

Хм... А есть еще особо тонкие ценители отступов. Так они еще на один отступ смещают BEGIN-END, а то, что внутри - тоже на один (как у тебя).
Не, ну действительно, почему это последний BREAK с отступом, а первый BEGIN - нет... Чем это он хуже BREAK-а
Вот я не хочу спорить с этим народом, и располагаю этот BEGIN на другой строке.

Но это все так... Размышления о прекрасном. Не более того.




Да, вот. Netspirit, ты ничего не сказал про мой код из предыдущего поста. Функционально эквивалентный, как мне пока кажется, тому, что мы обсуждаем.
Там, между прочим, нет ELSEIF-ов
Вместо одного EXIT-а и двух BREAK-ов -- два EXIT-а. Что уже легче.
Да и BREAK-и были нацелены на то, что в результате некой оконечной суеты таки произойдет выход с обязательным FALSE.
Теперь тот же выход, но без суеты.

А то придет nesco после праздника, и строго спросит: так на чем же вы все-таки договорились ???
Я его знаю
карма: 9

0