Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#16: 2012-09-03 09:33:24 ЛС | профиль | цитата
Повспоминал...
Первое - надо как-то, перед использованием CharLower, сделать строку "уникальной". Он же коцает по строке, не спрашивая счетчика ссылок на строку.
Второе - последний символ в строке облегчает жизнь в случае "последней звездочки(чек)" в маске. Типа произошла такая концовка: вход уже пустой, а маска еще вовсе нет -- в ней еще есть звездочки.

В общем, поправлять по любому надо (есть примеры, если не AV, то уж некорректного сравнения - это точно).
На сегодняшнем уровне образования (обогащенный опытом коллег) я делал бы так (см аттач).

Это было про StrMask.
Про FileSearch... Обнаружил, что ни одно доброе дело не остается безнаказанным.
Потеряна дуракоустойчивость -- тупое обращение к нижним точкам не из выходных событий (т.е. неправильное) может дать AV.
Попытка защиты от тупости -- в том же аттаче.


------------ Дoбавленo в 09.32:
Слушай, ну извини - не получается нифига.
Лови на мыло, однако
карма: 9

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#17: 2012-09-03 10:34:56 ЛС | профиль | цитата
А вот это я делать бы не стал


    end else if _prop_FullName then _hi_OnEvent(_event_onOtherFiles,Dir + FindData.cFileName)
else _hi_OnEvent(_event_onOtherFiles,FindData.cFileName);

Я не знаю, как кто, но я использовал в некоторых своих приложениях именно полноименный режим с onOtherFiles, возможно, что кто-то еще использовал. Еще раз хочу повториться -- кому надо, тот поставит парсер
карма: 22

0
Ответов: 9906
Рейтинг: 351
#18: 2012-09-03 10:54:27 ЛС | профиль | цитата
Дык я и не настаиваю.
О чем в мыле честно-благородно и написал: "просто у меня сейчас так -- это и скопировал"

Слушай, nesco, в мыле же кроме файлов и текст есть
карма: 9

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#19: 2012-09-03 10:59:33 ЛС | профиль | цитата
Никак не въеду, откуда в конце строки появились #0

  while (Str^<>#0)and(Msk^<>#0) do begin

у нас ведь не нультерминэйт строки, а добавочных #0 я че-то вообще не нашел, где они добавляются. Откуда эти #0 появляются, при вызове функции, что ли
------------ Дoбавленo в 10.59:
Galkov писал(а):
в мыле же кроме файлов и текст есть

Тю! А слона-то я и не заметил Ну, пардонсе, неувязочка вышла
карма: 22

0
Ответов: 9906
Рейтинг: 351
#20: 2012-09-03 11:03:45 ЛС | профиль | цитата
Кстати говоря, из положения, коды таки есть проблемы с обратной совместимостью, а исходный вариант "нелогичен" -- существует проверенный выход

Заводишь еще одно св-во, типа: FullOtherName. Делаешь ему правильный дефолт.
Получатся и волки сыты, и овцы - целы.

Опять же - не настаиваю.



------------ Дoбавленo в 11.03:
nesco писал(а):
Никак не въеду, откуда в конце строки появились #0

Они всегда там есть. Дельфи гарантирует. Типа заказал 1000 символов, а Дельфи всенепременно заведет 1001-й, и обязятельно его нулем сделает.
Чтобы все C-ники были счастливы
карма: 9

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#21: 2012-09-03 11:12:54 ЛС | профиль | цитата
Galkov писал(а):
Заводишь еще одно св-во, типа: FullOtherName. Делаешь ему правильный дефолт

О! А это выход, ты мне его напомнил. Была такая мысль вскользь, но че-то быстро пролетела мимо. А Х его З почему
------------ Дoбавленo в 11.12:
Galkov писал(а):
Дельфи гарантирует, типа заказал 1000 символов, а Дельфи всенепременно заведет 1001-й

Но это же в случае, если мы создаем строку и передаем по цепи ее указатель, а если мы передаем указатель на кусок чего-то вырванного Ну, это в тех случаях, когда используется SetLength из блока данных без создания строки, там может и не быть #0. Млин, попадался я уже на этот #0 в конце и не один раз. Компоненты криптографии, кстати, именно с блоками работают, а не со строками. Может, конечно, я и зря кипишь поднял, но на всякий случай неплохо бы определиться.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#22: 2012-09-03 11:35:05 ЛС | профиль | цитата
Ну поднял-то не зря. Но без причины
Фиг ты заставишь Дельфи сделать строку без нуля в конце.

Можешь не сомневаться - факт проверенный. И даже документированный, это точно. Но ссылок не приведу - давно слишком было...



------------ Дoбавленo в 11.34:
Почему не стал делать по старому.
Дельфи, со своей передачей аргументов в регистрах, хорошо обходит C-классику. Когда аргументов не больше 3-х (они лежат в региситрах EAX, EDX и ECX), и они не более, чем 32-х-битные.
4 аргумента -- перебор уже, начинается суета со стеком. По не очень убедительным причинам.
Оно нам надо.... Подумал я себе...
карма: 9

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#23: 2012-09-03 11:48:25 ЛС | профиль | цитата
Galkov писал(а):
4 аргумента -- перебор уже, начинается суета со стеком

Хитро выкрутился

Но со строками я так и не допер до конца твои выводы -- как мы тогда умудряемся в строках передавать #0 при конвертации из стрима, и как поведет с такой строкой твой код, где в середине будут #0 А ведь случаи с преобразованием стрима с бинарными данными в строку с последующим поиском уже попадались не один раз
карма: 22

0
Ответов: 9906
Рейтинг: 351
#24: 2012-09-03 11:50:58 ЛС | профиль | цитата
Кстати, еще один плюс прибавления одного символа в зад -- пропадают заморочки, когда строка =nil.
карма: 9

0
Ответов: 4622
Рейтинг: 746
#25: 2012-09-03 11:57:30 ЛС | профиль | цитата
nesco, считаю, нулевых символов в строке в любом случае быть не должно. Вообще, если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутся.
карма: 26

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#26: 2012-09-03 12:07:56 ЛС | профиль | цитата
Netspirit писал(а):
Вообще, если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутся

Ты это конвертору StreamToStr расскажи, и то, как с ним работают. Че-то не шибко спотыкаются об него компоненты. А вот применится новый код, и пользователь об него споткнется, а потом ему объясняй, что понимаешь -- конвертор выдает строку со всем набором символов ASCII, а вот StrMask по этим нулям заканчивает обработку. Какие глаза будут у пользователя
карма: 22

0
Ответов: 9906
Рейтинг: 351
#27: 2012-09-03 12:10:10 ЛС | профиль | цитата
nesco писал(а):
А ведь случаи с преобразованием стрима с бинарными данными в строку с последующим поиском уже попадались не один раз

Не, ну честно скажу, я про нулики в середине думал - ну их нафиг.
А с другой стороны, сделать по-честному "для любой Дельфячей строки" - затруднительно. Чего ты будешь делать с тем же CharLower.
Он то по всякому дальше нулика не пойдет.
Кстати говоря, вот тебе и компонент, который "споткнется": StrCase. Найти такие нетрудно: как только к винде обратились - тут им и кердык.

Самому регистр преобразовывать - совершенно неопрвданный геморрой. Юридически - это суверенное дело оси, а наше - указать правильную кодовую страницу для оси.

Получается, что декларировать полноценный бинарный поиск мы не сможем (и в старом элементе тоже).
Лучше уж сказать, что "только текст", чем "здесь читать, здесь не читать, здесь рыбу заворачивали"



Хотя повод для размышления ты предоставил, конечно же..........
карма: 9

0
Ответов: 4622
Рейтинг: 746
#28: 2012-09-03 12:16:54 ЛС | профиль | цитата
nesco писал(а):
Ты это конвертору StreamToStr расскажи, и то, как с ним работают

Ну, у меня как-то никогда не возникало желания использовать его для преобразования "не текстовых" файлов в строку. А с текстовыми он справляется вполне нормально.
карма: 26

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#29: 2012-09-03 12:32:55 ЛС | профиль | цитата
Netspirit писал(а):
у меня как-то никогда не возникало желания использовать его для преобразования "не текстовых" файлов в строку

Ты это COM-порту объяснишь, как ты ему подашь бинарные данные кроме как через строку со всеми символами ASCII. Вот, кстати, пользователи с подобным мышлением и не могли взять в толк, как это строка может иметь служебные символы внутри себя при работе через COM-порт, они все пытались найти способ как-то передать бинарные данные, но только не через строку, еще и меня напрячь им это сделать. Холивару было на эту тему: я им -- конвертните стрим в строку и не парьтесь, а они мне -- ты че, сдурел, такого быть не может, строка не может содержать #0 и иже с ним, или ты не застал
карма: 22

0
Ответов: 4622
Рейтинг: 746
#30: 2012-09-03 12:41:04 ЛС | профиль | цитата
Я не застал. Для меня логично было бы, чтобы для таких случаев понятие "бинарные данные" и "строка" не смешивались. А, кстати, проблем со служебными символами в конверторе быть не должно: для этого существует режим StreamToASCII. Так что обсуждение на тему
nesco писал(а):
как поведет с такой строкой твой код, где в середине будут #0
и
Netspirit писал(а):
если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутся
в случае StreamConvertor можно прекратить.
карма: 26

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