Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26113
Рейтинг: 2126
#421: 2020-01-03 16:34:32 ЛС | профиль | цитата
Galkov писал(а):
А то придет nesco после праздника, и строго спросит: так на чем же вы все-таки договорились ???

А я никуда и не уходил
Но чсзать, в вашем потоке послепраздничного сознания я уже потерялся
карма: 22

0
Ответов: 9906
Рейтинг: 351
#422: 2020-01-03 22:35:46 ЛС | профиль | цитата
Netspirit писал(а):
А вот тут мне не очень понятно чем "односимвольная строка" отличается от остальных

Слушай, я сам попытался воспроизвести этот баг - и НЕ СМОГ
Но я же не сумасшедший, чтобы прилепить эту облицовку из PChar с концевым ноликом... Потому что моей левой ноге так захотелось
CodeGen.pas

function StringToCode(const s:string):string;
................
Result := 'PChar(';
..............
Result := Result + '#0)';
end;
Чего точно помню: на такую сгенерированную строку _prop_Mask := '*'; - компилятор сильно обижался, сообщая, что типы string и char он совместить не состоянии. Т.е., он понимал '*' как символ, а не как строку. Если символов константе было несколько - то он это понимал как строку, а если один - то как символ.
Блин, вот ведь как живое перед глазами стоит

Сейчас я этого воспроизвести не могу. Пробую в IC - работает. Комментирую две вышеуказанные строки в CodeGen - тоже работает (после этого, вроде, должны заработать нолики в коротких константных строках).
Че к чему
Такую ошибку внешними файлами не сделаешь - это внутренняя семантика, только код самого компилятора.
Правда шибко давно это было... Сразу после выделения CodeGen в отдельную dll (да-да, когда-то его не было)
Сейчас-то компилятор из Alternative build, не факт, что полностью совпадает с тем, что был с народа.
В общем -- ничего не понимаю

Netspirit писал(а):
чего можно насмотреться по кодам наших компонентов

Тут ты прав - еще как можно.

Netspirit писал(а):
не имею чего возразить

Тоды: все старое удаляю, а новый (он же - последний) вариант выкладываю.

2nesco: мы условно договорились на том, что в аттаче к этому посту

Редактировалось 2 раз(а), последний 2020-01-03 22:44:24
карма: 9

0
файлы: 1StrMask.rar [1.1KB] [555]
Разработчик
Ответов: 26113
Рейтинг: 2126
#423: 2020-01-03 23:36:40 ЛС | профиль | цитата
Galkov писал(а):
мы условно договорились на том, что в аттаче к этому посту

Теперь осталось не забыть все это обновить после праздников.
карма: 22

0
Ответов: 17
Рейтинг: 0
#424: 2020-01-04 05:42:07 ЛС | профиль | цитата
Netspirit писал(а):

Для исправления строка 33 файла hiStrMask.pas должна выглядеть так:

Исправление работает

Netspirit писал(а):

Сообщите, если будут другие ошибки.


Если маска равна Null, то сравнение возвращает истину.

Редактировалось 1 раз(а), последний 2020-01-04 05:42:42
карма: 0

0
Ответов: 9906
Рейтинг: 351
#425: 2020-01-04 09:40:22 ЛС | профиль | цитата
Неправда ваша, дяденька....

Как минимум - не полная правда: истина будет, если еще и строка пустая.
А если не пустая - гарантированная ложь (при пустой маске, конечно же)

Причем - хоть до исправления Netspirit-а, хоть после его исправлений, хоть после моих исправлений.
Они данной ситуации не касались, аж совсем.

Редактировалось 3 раз(а), последний 2020-01-04 09:43:12
карма: 9

0
Ответов: 4629
Рейтинг: 749
#426: 2020-01-04 15:46:27 ЛС | профиль | цитата
Galkov, там в новом FPC поведение моей версии почему-то отличается от Delphi. Разбираюсь.

--- Добавлено в 2020-01-04 16:22:09

Откуда-то у меня взялся баг в реализации KOL.AnsiLowerCase()/KOL.AnsiUpperCase() - не инициализировался Result.
rav, для исправления:
- в файле HiAsm\compiler\FPC2\src\packages\KOLx64\kol.pas нужно поправить функции (в районе строки 21772)

function AnsiUpperCase(const S: AnsiString): AnsiString;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PAnsiChar(S), Len);
if Len > 0 then CharUpperBuffA(Pointer(Result), Len);
end;

function AnsiUpperCase(const S: WideString): WideString; // Overloaded (NetSpirit)
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PWideChar(S), Len);
if Len > 0 then CharUpperBuffW(Pointer(Result), Len);
end;

function AnsiLowerCase(const S: AnsiString): AnsiString;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PAnsiChar(S), Len);
if Len > 0 then CharLowerBuffA(Pointer(Result), Len);
end;

function AnsiLowerCase(const S: WideString): WideString; // Overloaded (NetSpirit)
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PWideChar(S), Len);
if Len > 0 then CharLowerBuffW(Pointer(Result), Len);
end;
- после исправления выполнить файл HiAsm\compiler\FPC2\src\_make_KOL.bat
- В файле hiStrMask.pas функция _StrCmp() должна выглядеть так:

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

if Result then
Inc(Msk)
else
Exit;
end;

Inc(Str);
end;

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

Result := (Str^ = #0) and (Msk^ = #0);
end;

Редактировалось 3 раз(а), последний 2020-01-04 16:30:42
карма: 26

0
Ответов: 9906
Рейтинг: 351
#427: 2020-01-04 18:21:25 ЛС | профиль | цитата
Netspirit писал(а):
не инициализировался Result

Потрясен и смят.
Инициализация любой строковой переменной нулем - это ведь опция языка.
А не каких то там колов-шмолов

Ну это я так.....
карма: 9

0
Ответов: 4629
Рейтинг: 749
#428: 2020-01-05 16:23:11 ЛС | профиль | цитата
В данном случае на месте Result оказывалась действительная строка (по факту, при пустой AnsiLowerCase(msk) возвращалась предыдущая str). Х.з. как оно так получалось - может где-то в стеке оставалась ссылка, что-то не чистилось после предыдущих вызовов для оптимизации.

Строго формально, согласно языку все локальные переменные должны инициализироваться программистом. У компилятора даже есть такое
Warning: function result variable of a managed type does not seem to initialized
То-есть, хотя компилятор сам обнуляет строковые переменные, потому как автоматически управляет счетчиком ссылок (а при неинициализированной переменной гарантированно падал бы на этом), но это, всё же, "особенности реализации", на которые не стоит полагаться.

Редактировалось 2 раз(а), последний 2020-01-05 16:25:28
карма: 26

0
Ответов: 9906
Рейтинг: 351
#429: 2020-01-05 19:26:19 ЛС | профиль | цитата
Netspirit писал(а):
но это, всё же, "особенности реализации", на которые не стоит полагаться

Ну не знаю даже...
Вообще-то говоря - да. Но, если в опцию языка заложены счетчики ссылок для некого типа, за которыми он следит неусыпно, тогда и нулевая инициализация должна быть опцией языка.
А то ведь так можно договориться и до TRY-FINALLY блоков вокруг строковых переменных - дескать это твои проблемы, а не языка.
Наверное, возможности перепихивать все чего ни поподя на пользователя зависят и от языка, во многом.
Скажем, в CPP - можно сказать: не боярин, в конструкторе пропиши чего тебе надо.
А у нас - ни одного ведь файла не останется не тронутым, если мы начнем строковые переменные обнулять

Это были просто мысли вслух (типа - наплевать и забыть).


А теперь соображения...

По хорошему если, то наш _StrCmp надо в KOL помещать, под именем _StrSatisfy.
Ничего особо криминального, но в результирующем коде могут оказать две вышеуказанные функции (одна наша, одна KOL-овская) обладающие тождественным функционалом. Как оказалась.
Скажем, при использовании в схеме DirTools.doGetSize и StrMask.doCompare (это не единственный вариант).

Теоретически, можно и наоборот... Но наша то - по любому красивше.

Редактировалось 3 раз(а), последний 2020-01-05 19:29:23
карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#430: 2020-01-10 15:52:42 ЛС | профиль | цитата
Galkov писал(а):
Тоды: все старое удаляю, а новый (он же - последний) вариант выкладываю.

Таак. А что писать-то про фикс? Я тут че, должен сидеть и выдумывать -- а как это все правильно описать-то?
Так что давайте-ка сопроводиловку в формате fix: <бла-бла-бла>
карма: 22

0
Ответов: 9906
Рейтинг: 351
#431: 2020-01-11 23:29:01 ЛС | профиль | цитата
nesco писал(а):
а как это все правильно описать-то?

fix: <Отказ от полного перекопирования тестируемой строки (возможно многометровой) в экспортируемой ф-ии StrCmp>

Редактировалось 1 раз(а), последний 2020-01-12 11:58:08
карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#432: 2020-01-12 12:34:01 ЛС | профиль | цитата
Galkov писал(а):
fix: <Отказ от полного перекопирования тестируемой строки (возможно многометровой) в экспортируемой ф-ии StrCmp>

А вот тоже самое, только по английски, вроде как на кириллице на SVN нежелательно писать. И нельзя ли эту фразу как-то попроще оформить?

PS. Да, хотел еще спросить -- а в чем сакральный смысл перестановки свойств местами в *.ini файле?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#433: 2020-01-12 13:21:27 ЛС | профиль | цитата
Да я по русски-то все мозги себе сломал
Чтобы угадать, зачем Netspirit это в качестве главной идеи поставил.
Может у него получится проще (и по буржуински).

nesco писал(а):
в чем сакральный смысл перестановки свойств местами в *.ini файле?
Вот:
Galkov писал(а):
(в INI изменен порядок свойств, чтобы при инициализации Mask было известно: он CaseSesinive, или нет)
Чтобы CodeGen делал присваивания именно в таком порядке (а не наоборот):
................
//Init for StrMask;
StrMask_55F5490 := THIStrMask.Create;
with StrMask_55F5490 do begin
_prop_CaseSensitive := 1;
_prop_Mask := 'Ed***#';
end;
................

Редактировалось 7 раз(а), последний 2020-01-12 14:31:59
карма: 9

0
Ответов: 9906
Рейтинг: 351
#434: 2020-01-12 14:26:56 ЛС | профиль | цитата
Правда, если никому ничего не объяснять........
А просто и тупо (хотя и коряво): Убирание добавления символа #1 в конец входных строк
Тогда Яндекс.Переводчик дает: Removing the addition of the #1 character to the end of input strings
А уж зачем убирать... Почему убирать... Почему столько изменений из-за простого "убирания"...
Типа - тема отдельной диссертации.


А вот попытка вольного перевода первого варианта: Removing a full copying of input strings (possibly extremely long) in the exported StrCmp function
Но, сразу скажу - с языками у меня напряг, только со словарем...

Редактировалось 9 раз(а), последний 2020-01-12 14:42:57
карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#435: 2020-01-12 15:42:19 ЛС | профиль | цитата
Ладно, понял. Подождем, что скажет начальник транспортного цеха
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)