Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2020-01-02 22:36:29 ЛС | профиль | цитата
Netspirit писал(а):
Не, ну к CharLower() никаких претензий нет:

Как бы это помягче сказать...
Скажем так: Если бы она не падала, при попытке модифицировать пустую строку (т.е., когда не надо делать ничего), то я бы сказал, что она работает так как написано в документации.

Netspirit писал(а):
Упадёт, например, на константе, как и PChar()

Не совсем понял: ты имеешь в виду исключения при попытке модификации в кодовом сегменте, защищенном от записи ???
Так не помню я у нас таких строк... А падала она на пустой строке (повторюсь: когда не надо делать ничего).
И что точно можно сказать, что даже константная строка (у которой RefCnt=-1) после UniqueString попадает в хип, т.е. в сегмент памяти разрешенный на запись.

Netspirit писал(а):
А вот CharLower(@S[1]) может и проканает

Вспомнил, было такое:
procedure THIFileSearch.OutFiles;
var fn:string; i:integer;
begin
fn := Name; {$ifdef F_P}UniqueString(fn);{$endif} CharLower(@fn[1]);
.............
И все как ты сказал: Delphi воспринимает сие как вмешательство в строку и автоматом уникализирует ее, а FPC - фигушки.
Самолично проверял дизасмом: чего это за фигня, думаю себе - два раза подряд вызывается UniqueString, я же один раз писал.
Хотя уникализация уже уникальной строки не делает ничего (в смысле - не заморачивается с хипом). В отличие, между прочим, от AnsiLowerCase. И в котором, не к ночи будет сказано, вызов winapi таки защищается от пустой строки.
Причем, что занимательно: использование @fn[1] воспринимается как вмешательство в строку, а использование pointer(fn) - не воспринимается.
Велик и могуч буржуинский интеллект, однако

Netspirit писал(а):
кроме как к форматированию кода, ну, и названия функций, обычно, должны отражать действие, то-есть, SetMask(), а не просто Mask()

Про SetMask согласен сразу, это была просто неистребимая природная лень в написании тех буковок.

А про форматирование - не соглашусь.
Вопрос не принципиальный, и агитировать никого не буду, но мне ближе Обероновский стиль.
На котором это выглядело бы примерно так (на вскидку, в спецификации давно не лазил):
  WHILE (Str^<>#0)and(Msk^<>#0) DO
IF Msk^ = '*' THEN
Result := _StrCmp(Str,Msk+1);
IF Result THEN EXIT;
ENDIF;
ELSEIF Msk^ = '#' THEN
IF Str^ IN ['0'..'9'] THEN INC(Msk);
ELSE BREAK;
ENDIF;
ELSEIF (Msk^ = '?')OR(Msk^ = Str^) THEN INC(Msk);
ELSE BREAK;
ENDIF;
INC(Str);
ENDWHILE;
WHILE Msk^ = '*' DO INC(Msk);
ENDWHILE;
Result := (Str^ = #0)AND(Msk^ = #0);
Ну нет там begin-ов, потому нет вопроса, на какой строке его моднее ставить. Ну я и ставлю его как бы типа не очень заметно.
А отсутствие в языке elseif-а не вынуждает меня строить лесенки...
Нет, ну конечно, совсем канонически было БЫ после служебных слов THEN ELSE DO - начинать новый statement с новой строки с отступом.
Но, отнесем это к совсем уж мелкой вредности... Типа, если statement всего один, то можно и нахулиганить. Самую малость.
Вообще-то, я комбинацию end else if воспринимаю (но никому не навязываюсь) как единый и целый elseif.
А лесенки при форматировании - только запутывают. Обероновцы, они вообще на цикл Дейкстры молятся. Который позволяет много-вложенный цикл писать не лесенкой, а на одном отступе.
Но, повторюсь: никому не навязываюсь.
Просто немного не соглашусь
карма: 9

0
Редактировалось 8 раз(а), последний 2020-01-02 23:24:28