Я (Lapp) вклинился сюда, чтоб привести ссылку на ту тему в FAQ, о которой идет речь:
Многократное удаление символов из строки
[конец вставки]
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Обсуждение "Многократного удаления из строки", Разделено |
Client |
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
[вставка]
Я (Lapp) вклинился сюда, чтоб привести ссылку на ту тему в FAQ, о которой идет речь: Многократное удаление символов из строки [конец вставки] Цитата Дело в том, что Delete - это не мгновенная операция Эм... я вот не нашел исходник этой процедуры и не знаю насколько она "не мгновенная". А move - уже не в счет? Хотя, видимо, тоже долго работает... |
volvo |
Сообщение
#2
|
Гость |
Цитата я вот не нашел исходник этой процедуры и не знаю насколько она "не мгновенная" Не нашел, говоришь? Ну, вот реализация Delete из FPC:procedure delete(var s : shortstring;index : SizeInt;count : SizeInt);, а сам Move - еще краше: procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];assembler;nostackframe;Реализацию fastmoveproc_forward и fastmoveproc_backward привести, или сам найдешь? Поверь, мгновенной телепортации всего блока с места на место там точно нет - обычный цикл (хотя нет, не обычный, а очень замороченный). P.S. Давайте все-таки не постить темы сразу в FAQ, а для начала выкладывать в общем разделе, с пометкой "Материал для FAQ", чтобы все могли принять участие в обсуждении/дополнении материала, а потом уже, когда автор решит, что больше корректировать ничего не надо, тема разделится, и уйдет в FAQ, а обсуждение останется в общем разделе (ну, или будет удалено). |
TarasBer |
Сообщение
#3
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> А move - уже не в счет? Хотя, видимо, тоже долго работает...
Пропускная способность памяти очень ограничена, поэтому копирование блока, особенно, когда его размер выходит за 100 килобайт, занимает некоторое время, пропорциональное длине блока. > , а сам Move - еще краше: Я видел реализацию через возможность сопроцессора загружать и выгружать по 8 байт. -------------------- |
Lapp |
Сообщение
#4
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
P.S. Давайте все-таки не постить темы сразу в FAQ, а для начала выкладывать в общем разделе, с пометкой "Материал для FAQ", чтобы все могли принять участие в обсуждении/дополнении материала, а потом уже, когда автор решит, что больше корректировать ничего не надо, тема разделится, и уйдет в FAQ, а обсуждение останется в общем разделе (ну, или будет удалено). Мне кажется, установление всяких специальных правил на этот счет излишне. Ведь никто же не ограничивает - если кто-то хочет сначала обсудить, он откроет тему и обсудит. Или тема сначала не предназначается для FAQ, но дозревает до этого. Бывают случаи, когда обсуждать особо нечего, и тема сразу готова для FAQ (как в нынешнем). Но это не значит, что это нельзя - пожалуйста, создаете тему в подходящем разделе и вперед.. Кто мешает? Конечно, отвечать/спрашивать ПРЯМО в FAQ - это неправильно и приводит к тому, что админ должен переносить. Но это же вопрос грамотности наших пользователей, и не более того. Совершенно не секрет, что даже постоянные пользователи Форума не знают его Правил, а также часто плюют на правила разделов. И это - объективная оценка ситуации. Так оно было, есть и будет, и тут ничего поделать нельзя. И если мы даже введем специальную процедуру для наполнения FAQ, это будет всего лишь еще одно правило, которое будет нарушатся ничем не хуже остальных, я готов спорить. И на фига оно нам тогда? и так уже у меня крыша едет от нарушений - как новичками, так и старичками. А, с другой стороны, процесс наполнения FAQ нужно поддерживать. Любая заорганизованность будет препятствием. Если бы у нас статьи в FAQ сыпались бы одна за другой, как из рога изобилия - я был бы ЗА. А так - мой голос ПРОТИВ. К тому же, вопросы по содержимому FAQ могут возникать на любом этапе, даже к старой статье. Так что определить, когда тема "созрела" не всегда возможно. И если возникла ситуация как сегодня - ну, ничего страшного, мне кажется.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
Сообщение
#5
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Эм... я вот не нашел исходник этой процедуры и не знаю насколько она "не мгновенная". А move - уже не в счет? Хотя, видимо, тоже долго работает... Client, а с каких пор для оценки времени выполнения нужны исходники? простое профилирование или даже обычный замер исполнения в цикле - не катят? То есть, я понимаю, что там будут ошибки, но эти "ошибки" вполне реальны и их тоже следует учитывать..Честно, меня немного удивляет, когда человек лезет в дебри, не попытавшись сделать простую вещь.. Кстати, в конце обсуждаемого сообщения Тарас приводит какую-никакую оценку. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Client |
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
Проясняю ситуацию...
я как бы "за" move тут выступил. НО! я не знаю (точнее не знал) как она работает и которая как раз используется в процедуре Delete. Вот Цитата какую-никакую оценку. Я не говорю что тема с ошибками или еще что-то. У меня же нету этого самого теста, чтобы сравнить с move. И результаты сравнения я видел.Цитата Конечно, отвечать/спрашивать ПРЯМО в FAQ - это неправильно и приводит к тому, что админ должен переносить Все ответы в FAQ проходят проверку, я это знал и ответил туда, т.к. посчитал это наилучшим вариантом |
Lapp |
Сообщение
#7
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
я как бы "за" move тут выступил. НО! я не знаю (точнее не знал) как она работает и которая как раз используется в процедуре Delete. Я согласен, что от этого немало зависит. Но в любом случае приведенный способ лучше (т.е. даже если Delete реализована наилучшим из возможных способов). И - всегда есть возможность настучать пару строк и потестить )).Цитата Все ответы в FAQ проходят проверку, я это знал и ответил туда, т.к. посчитал это наилучшим вариантом Так или иначе, если есть вопросы - лучше все же начать отдельную тему с обсуждением ))-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
Сообщение
#8
|
Гость |
TarasBer, насколько я вижу,
Цитата j := Low(S);Это для статического массива, у которого полезная длина хранится в отдельной переменной. может привести к неправильному результату:
Казалось бы чего проще, LS := j - Low(S)? Но только это не решит проблемы. Массивы могут индексироваться не только с 1, 2, и так далее. А и с 0, и с (-1). А при первом отрицательном индексе (при цикле до LS) будет Range-Check Error. Я бы предложил: j := Low(S); Сообщение отредактировано: volvo - |
TarasBer |
Сообщение
#9
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
значит, надо так:
LS := j - 1; > for i := Low(S) to High(S) do Для статического массива так не катит. Ведь их заводят с большим запасом, и большая часть статического массива, как правило, не используется. У меня LS означает номер последнего индекса. Исправил этот нюанс в статье. Сообщение отредактировано: TarasBer - -------------------- |
volvo |
Сообщение
#10
|
Гость |
Цитата значит, надо так: Значит, индексировать с (-N) - таки нельзя. Ясно. На фиг такой код.LS := j - 1; |
TarasBer |
Сообщение
#11
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Как нельзя?!
-------------------- |
Текстовая версия | 19.04.2024 6:36 |