Повспоминал...
Первое - надо как-то, перед использованием CharLower, сделать строку "уникальной". Он же коцает по строке, не спрашивая счетчика ссылок на строку.
Второе - последний символ в строке облегчает жизнь в случае "последней звездочки(чек)" в маске. Типа произошла такая концовка: вход уже пустой, а маска еще вовсе нет -- в ней еще есть звездочки.
В общем, поправлять по любому надо (есть примеры, если не AV, то уж некорректного сравнения - это точно).
На сегодняшнем уровне образования (обогащенный опытом коллег) я делал бы так (см аттач).
Это было про StrMask.
Про FileSearch... Обнаружил, что ни одно доброе дело не остается безнаказанным.
Потеряна дуракоустойчивость -- тупое обращение к нижним точкам не из выходных событий (т.е. неправильное) может дать AV.
Попытка защиты от тупости -- в том же аттаче.
------------ Дoбавленo в 09.32:
Слушай, ну извини - не получается нифига.
Лови на мыло, однако
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
|
|||
карма: 9 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
А вот это я делать бы не стал
Я не знаю, как кто, но я использовал в некоторых своих приложениях именно полноименный режим с onOtherFiles, возможно, что кто-то еще использовал. Еще раз хочу повториться -- кому надо, тот поставит парсер |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Дык я и не настаиваю.
О чем в мыле честно-благородно и написал: "просто у меня сейчас так -- это и скопировал" Слушай, nesco, в мыле же кроме файлов и текст есть |
|||
карма: 9 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Никак не въеду, откуда в конце строки появились #0
у нас ведь не нультерминэйт строки, а добавочных #0 я че-то вообще не нашел, где они добавляются. Откуда эти #0 появляются, при вызове функции, что ли ------------ Дoбавленo в 10.59: Galkov писал(а): в мыле же кроме файлов и текст естьТю! А слона-то я и не заметил Ну, пардонсе, неувязочка вышла |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Кстати говоря, из положения, коды таки есть проблемы с обратной совместимостью, а исходный вариант "нелогичен" -- существует проверенный выход
Заводишь еще одно св-во, типа: FullOtherName. Делаешь ему правильный дефолт. Получатся и волки сыты, и овцы - целы. Опять же - не настаиваю. ------------ Дoбавленo в 11.03: nesco писал(а): Никак не въеду, откуда в конце строки появились #0Они всегда там есть. Дельфи гарантирует. Типа заказал 1000 символов, а Дельфи всенепременно заведет 1001-й, и обязятельно его нулем сделает. Чтобы все C-ники были счастливы |
|||
карма: 9 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Galkov писал(а): Заводишь еще одно св-во, типа: FullOtherName. Делаешь ему правильный дефолтО! А это выход, ты мне его напомнил. Была такая мысль вскользь, но че-то быстро пролетела мимо. А Х его З почему ------------ Дoбавленo в 11.12: Galkov писал(а): Дельфи гарантирует, типа заказал 1000 символов, а Дельфи всенепременно заведет 1001-йНо это же в случае, если мы создаем строку и передаем по цепи ее указатель, а если мы передаем указатель на кусок чего-то вырванного Ну, это в тех случаях, когда используется SetLength из блока данных без создания строки, там может и не быть #0. Млин, попадался я уже на этот #0 в конце и не один раз. Компоненты криптографии, кстати, именно с блоками работают, а не со строками. Может, конечно, я и зря кипишь поднял, но на всякий случай неплохо бы определиться. |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ну поднял-то не зря. Но без причины
Фиг ты заставишь Дельфи сделать строку без нуля в конце. Можешь не сомневаться - факт проверенный. И даже документированный, это точно. Но ссылок не приведу - давно слишком было... ------------ Дoбавленo в 11.34: Почему не стал делать по старому. Дельфи, со своей передачей аргументов в регистрах, хорошо обходит C-классику. Когда аргументов не больше 3-х (они лежат в региситрах EAX, EDX и ECX), и они не более, чем 32-х-битные. 4 аргумента -- перебор уже, начинается суета со стеком. По не очень убедительным причинам. Оно нам надо.... Подумал я себе... |
|||
карма: 9 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Galkov писал(а): 4 аргумента -- перебор уже, начинается суета со стекомХитро выкрутился Но со строками я так и не допер до конца твои выводы -- как мы тогда умудряемся в строках передавать #0 при конвертации из стрима, и как поведет с такой строкой твой код, где в середине будут #0 А ведь случаи с преобразованием стрима с бинарными данными в строку с последующим поиском уже попадались не один раз |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Кстати, еще один плюс прибавления одного символа в зад -- пропадают заморочки, когда строка =nil.
|
|||
карма: 9 |
|
Ответов: 4631
Рейтинг: 749
|
|||
nesco, считаю, нулевых символов в строке в любом случае быть не должно. Вообще, если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутся.
|
|||
карма: 26 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Netspirit писал(а): Вообще, если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутсяТы это конвертору StreamToStr расскажи, и то, как с ним работают. Че-то не шибко спотыкаются об него компоненты. А вот применится новый код, и пользователь об него споткнется, а потом ему объясняй, что понимаешь -- конвертор выдает строку со всем набором символов ASCII, а вот StrMask по этим нулям заканчивает обработку. Какие глаза будут у пользователя |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
nesco писал(а): А ведь случаи с преобразованием стрима с бинарными данными в строку с последующим поиском уже попадались не один разНе, ну честно скажу, я про нулики в середине думал - ну их нафиг. А с другой стороны, сделать по-честному "для любой Дельфячей строки" - затруднительно. Чего ты будешь делать с тем же CharLower. Он то по всякому дальше нулика не пойдет. Кстати говоря, вот тебе и компонент, который "споткнется": StrCase. Найти такие нетрудно: как только к винде обратились - тут им и кердык. Самому регистр преобразовывать - совершенно неопрвданный геморрой. Юридически - это суверенное дело оси, а наше - указать правильную кодовую страницу для оси. Получается, что декларировать полноценный бинарный поиск мы не сможем (и в старом элементе тоже). Лучше уж сказать, что "только текст", чем "здесь читать, здесь не читать, здесь рыбу заворачивали" Хотя повод для размышления ты предоставил, конечно же.......... |
|||
карма: 9 |
|
Ответов: 4631
Рейтинг: 749
|
|||
nesco писал(а): Ты это конвертору StreamToStr расскажи, и то, как с ним работаютНу, у меня как-то никогда не возникало желания использовать его для преобразования "не текстовых" файлов в строку. А с текстовыми он справляется вполне нормально. |
|||
карма: 26 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Netspirit писал(а): у меня как-то никогда не возникало желания использовать его для преобразования "не текстовых" файлов в строкуТы это COM-порту объяснишь, как ты ему подашь бинарные данные кроме как через строку со всеми символами ASCII. Вот, кстати, пользователи с подобным мышлением и не могли взять в толк, как это строка может иметь служебные символы внутри себя при работе через COM-порт, они все пытались найти способ как-то передать бинарные данные, но только не через строку, еще и меня напрячь им это сделать. Холивару было на эту тему: я им -- конвертните стрим в строку и не парьтесь, а они мне -- ты че, сдурел, такого быть не может, строка не может содержать #0 и иже с ним, или ты не застал |
|||
карма: 22 |
|
Ответов: 4631
Рейтинг: 749
|
|||
Я не застал. Для меня логично было бы, чтобы для таких случаев понятие "бинарные данные" и "строка" не смешивались. А, кстати, проблем со служебными символами в конверторе быть не должно: для этого существует режим StreamToASCII. Так что обсуждение на тему
nesco писал(а): как поведет с такой строкой твой код, где в середине будут #0Netspirit писал(а): если при преобразовании стрима в строку в ней могут попадаться нулевые символы, многие компоненты об них споткнутся |
|||
карма: 26 |
|