Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26151
Рейтинг: 2127
#91: 2016-04-04 16:11:00 ЛС | профиль | цитата
flint2 писал(а):
Полёт нормальный.

nesco писал(а):
Я же просто пример привел, а не полные исправления кода

См. предыдущий пост.
карма: 22

0
Ответов: 2059
Рейтинг: 132
#92: 2016-04-04 16:29:02 ЛС | профиль | цитата
nesco писал(а):
Я же просто пример привел, а не полные исправления кода

Это понятно.
Я перепутал fn и Ex - дало ошибку. Потом отвлёкся и вернул старую строку по ошибке или рассеянности.
Спасибо.
карма: 6

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#93: 2016-04-04 16:33:33 ЛС | профиль | цитата
flint2 писал(а):
Я перепутал fn и Ex - Потом отвлёкся и вернул старую строку по ошибке или рассеянности.

Ну и че, валится или не валится, и как работает?
карма: 22

0
Ответов: 2059
Рейтинг: 132
#94: 2016-04-04 16:38:46 ЛС | профиль | цитата
Так я докладывал.
flint2 писал(а):
Каюсь - грешен.
Всё работает.

Всё работает, как надо!
карма: 6

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#95: 2016-04-04 16:46:41 ЛС | профиль | цитата
flint2 писал(а):
Всё работает, как надо!

Это уже хорошо, но мне все же интересно, что скажет начальник транспортного цеха.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#96: 2016-04-04 17:56:13 ЛС | профиль | цитата
nesco писал(а):
Galkov, а почему
  CharLower(PChar(fn));
а не
  CharLower(@fn[1]);
Ведь последнее не вызывает падения
Вообще-то - вызывает (при fn=nil).

Потому-что PChar -- это вам не баб щупать
Это хитрая функция, которая гарантирует НЕ НОЛЬ.
Если строка пустая (fn=nil), то она спецом возвращает реальный адрес на константную пустую строку (на нулик, грубо говоря).


------------ Дoбавленo в 17.56:
Пока вы тут думаете, я немного соптимизировал код (см. аттач)
Абсолютно тот же функционал (просто "ногами" запихал multiCmp унутрь OutFiles)

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

nesco, решай сам про все эти "хотелки". В смысле: мне более, или менее -- все равно.
карма: 9

0
файлы: 1hifilesearch_new2.rar [1.8KB] [313]
Разработчик
Ответов: 26151
Рейтинг: 2127
#97: 2016-04-04 19:20:07 ЛС | профиль | цитата
Galkov писал(а):
Это хитрая функция, которая гарантирует НЕ НОЛЬ.

То-то она нагарантировала, что валится при пустой строке. Вот, пожалуйста, нажми кнопку и увидишь, если нам не веришь

Add(MainForm,14210893,182,140)
{
}
Add(InlineCode,4094146,245,196)
{
WorkPoints=#5:Lower|
EventPoints=#6:Result|
DataPoints=#3:Str|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|11: Result,|19: Str: THI_Event;|51: procedure Lower(var _Data: TData; Index: word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmClass.Lower;|3:var|13: st: string;|5:begin|31: st := ReadString(_Data, Str);|19: UniqueString(st);|47: _hi_onEvent(Result, CharLower(PChar(st))); |4:end;|0:|4:end.|
link(Result,12047234:doText,[])
link(Str,7462654:Text,[])
}
Add(Edit,7462654,245,140)
{
Left=10
Top=10
Width=220
Text=""
}
Add(Edit,12047234,308,196)
{
Left=10
Top=35
Width=220
Text=""
}
Add(Button,9286840,182,196)
{
Left=90
Top=65
TabOrder=-1
link(onClick,4094146:Lower,[])
}

и сравни вот с этим кодом

Add(MainForm,2953706,77,119)
{
}
Add(InlineCode,4094146,140,175)
{
WorkPoints=#5:Lower|
EventPoints=#6:Result|
DataPoints=#3:Str|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|11: Result,|19: Str: THI_Event;|51: procedure Lower(var _Data: TData; Index: word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmClass.Lower;|3:var|13: st: string;|5:begin|31: st := ReadString(_Data, Str);|19: UniqueString(st);|44: _hi_onEvent(Result, CharLower(@st[1])); |4:end;|0:|4:end.|
link(Str,7462654:Text,[])
link(Result,12047234:doText,[])
}
Add(Edit,7462654,140,119)
{
Left=10
Top=10
Width=220
Text=""
}
Add(Edit,12047234,203,175)
{
Left=10
Top=35
Width=220
Text=""
}
Add(Button,9286840,77,175)
{
Left=90
Top=65
TabOrder=-1
link(onClick,4094146:Lower,[])
}


А вот теперь объясни -- почему при пустой строке PChar(st) валится, а @st[1] не валится?
карма: 22

0
Ответов: 2059
Рейтинг: 132
#98: 2016-04-04 19:25:00 ЛС | профиль | цитата
Galkov писал(а):
Если строка пустая (fn=nil), то она спецом возвращает реальный адрес на константную пустую строку (на нулик, грубо говоря).

Мудрёно наплёл, но доходчиво.
Пока вы тут думаете, я немного соптимизировал код (см. аттач)

Завтра, завтра, не сегодня - так лентяи говорят.
[flood]
Домашние хлопоты - обед-ужин на две персоны, брюки перешить. - Сын худеет на турнике. Я только 18, а он 210 при весе 85.
+ пиво + уже, и когда пенсия будет(Обычно Лужковские приходили в это время)? - Наверное Греф, Герман Оскарович прокручивает...
[/flood]
nesco, решай сам про все эти "хотелки". В смысле: мне более, или менее -- все равно.

По большому счёту всем аналогично, но как тусовать Files,Dirs и All будут те, у кого отвёртки нет.
Или метода воспитания такая?
карма: 6

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#99: 2016-04-04 19:30:13 ЛС | профиль | цитата
flint2 писал(а):
Завтра, завтра не сегодня - так лентяи говорят

Приготовься к тому, что при пустом Ext оно у тебя свалится
карма: 22

0
Ответов: 2059
Рейтинг: 132
#100: 2016-04-04 19:32:43 ЛС | профиль | цитата
nesco, я уже просёк.
[flood]
На самом деле, я не такой глупый, как кажется, а значительно гораздей.
[/flood]
flint2 писал(а):
nesco, я уже просёк.

Будем посмотреть.

карма: 6

0
Ответов: 9906
Рейтинг: 351
#101: 2016-04-05 00:22:18 ЛС | профиль | цитата
Все, nesco -- разобрался блин. И сделал маленькое открытие, упрощающее наши коды.

1) Почему не падает @fn[1].
Вообще-то, это тип pchar, который, для пустой строки fn - тупо равен нулю (проверил отладочными выводами). Если им пользоваться как указателем на символ - упадет сразу. В твоем коде это передается в _hi_onEvent, а Дельфи сначала переводит это дело в строку с помощью LStrFromPChar. А там есть "страховочка" против нулевого указателя. Она возвращает пустую строку. Потому и не падает.
В ком еще есть "страховочка", а в ком ее нет -- тайна сия велика есть.

2) Почему падает CharLower.
Потому что мягкотелые - говнюки. Оказывается, привести к нижнему регистру пустую строку - неразрешимая задача. Это мой прокол, ибо такой гадости я от них не ожидал.
НО, они подстелили соломку для лохов. Если указатель на строку "почти нулевой" (hword=0), то они считают его не указателем, а символом, который приводят к нижнему регистру и его и возвращают. Т.е., если ты лоханулся, и влепил нулевой указатель, то они посчитают его нулевым символом, приведут его к нижнему регистру, и ноль же и вернут.
Неправильными действиями получаем правильный результат, потому что кто-то специально рассчитал, что ты будешь действовать неправильно.
Дурдом на каникулах, но я в этом не виноват.

3) Маленькое открытие.
Дельфи, в тот момент, когда ты где-то запомнил указатель на символ строки, начинает подозревать тебя в том, что ты будешь менять содержимое строки, и АВТОМАТИЧЕСКИ выполняет UniqueString, без нашего участия. Если и мы это делаем, то это делается два раза (буквально подряд).
Вот такой он парень, этот Дельфи. Если мы получаем указатель на символы с помощью PChar(fn) -- то он нас ни в чем плохом не подозревает. А если тот же самый указатель с помощью @fn[1] -- сразу же влепляет UniqueString.

4) Вывод.
Надо делать CharLower(@st[1]) с последующим автоматическим преобразованием его в string, и забыть про UniqueString (он сам про него вспомнит).
Обновил этот аттач по вышеуказанным причинам.


------------ Дoбавленo в 00.22:
nesco писал(а):
То-то она нагарантировала
Ну а я-то тут причем. Вот ее код из system.pas (если убрать условную компиляцию, для понятности)
#pas
function _LStrToPChar(const s: AnsiString): PChar;
asm
{ -> EAX pointer to str }
{ <- EAX pointer to PChar }

TEST EAX,EAX
JE @@handle0
RET
@@zeroByte:
DB 0
@@handle0:
MOV EAX,offset @@zeroByte
end;
Вот то тебе и весь сказ
карма: 9

1
Голосовали:flint2
Ответов: 2059
Рейтинг: 132
#102: 2016-04-05 09:32:12 ЛС | профиль | цитата
Galkov писал(а):

1)...
2)...
3)...
Дурдом на каникулах, но я в этом не виноват.)

Гигант мысли, отец русской демократии!
Если указатель на строку "почти нулевой" (hword=0), то они считают его не указателем, а символом, который приводят к нижнему регистру и его и возвращают.

Есть такое дело!

asm
{ -> EAX pointer to str }
{ <- EAX pointer to PChar }
Крутой отладчик.

и АВТОМАТИЧЕСКИ выполняет UniqueString,

Было такое подозрение и у меня.

Хотел всё это дело прокомментировать, но не нашел слов.
Вот, что я Вам скажу профессор - Нобелевку Вам давно пора!
карма: 6

0
Ответов: 9906
Рейтинг: 351
#103: 2016-04-05 10:01:36 ЛС | профиль | цитата
Хм.. Поправочка:
Galkov писал(а):
Вот такой он парень, этот Дельфи
-- а вот FPC уже не такой крутой парень.
Поэтому пришлось вернуть {$ifdef F_P}UniqueString(Ex);{$endif} перед применением CharLower
См. тот же аттач
карма: 9

0
Ответов: 2059
Рейтинг: 132
#104: 2016-04-05 10:30:59 ЛС | профиль | цитата
-- а вот FPC уже не такой крутой парень.

Delphi7 - тоже иначе себя ведёт.

Delphi, FPC, Delphi7 - Всё ОК!

карма: 6

0
Ответов: 9906
Рейтинг: 351
#105: 2016-04-05 10:56:53 ЛС | профиль | цитата
flint2, может мы дождемся реальных дел, а не "много буков"

Проверять последнее исправление надо на выдачу на выход оригинальных имен, если они отличаются от приведенных к нижнему регистру
Вот здесь:
#pas
procedure THIFileSearch.OutFiles(const Dir,Name:string);
var fn:string; i:integer;
begin
fn := Name; {$ifdef F_P}UniqueString(fn);{$endif} CharLower(@fn[1]);
....
-- отсутствие UniqueString приводит к нижнему регистру не только fn, но и Name. Который и попадает на выход. И это сразу видно.Про D7 - ничего не скажу, потому-что у меня его нет. За ненадобностью.

А в аттаче я вижу пока 0 закачек, но сообщение, что все круто.
карма: 9

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