Инверсия символьной строки | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Положим, есть строка '!МОДОГ 7102 МЫВОН C'
Нужно строку "развернуть", чтобы получилось "С НОВЫМ 2017 ГОДОМ!" Притом сделать такой разворот как можно быстрее по времени исполнения. Ясное дело, что можно побайтно читать строку справа налево и перезаписать ее. Но можно ли символьную строку "развернуть", используя какую-нибудь функцию VFP? Поискал на форуме. Вроде бы есть похожая тема, но там речь шла о разворачивании данных типа FLOAT. forum.foxclub.ru Похоже, что функции bintoc/ctobin с флажком R для символьных строк применять нельзя. Может быть, можно еще как-то "развернуть" символьную строку? |
Re: Инверсия символьной строки | |
---|---|
Pliskin Сообщений: 2959 Откуда: Новосибирск Дата регистрации: 19.11.2003 |
Чем не нравится такое:
|
Re: Инверсия символьной строки | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Да, такое не нравится. Такое я и сам умею.
Если так разворачивать нехилый по размеру текст, то будет весьма долго работать. К этому способу прибегну, если другого не найдется. |
Re: Инверсия символьной строки | |
---|---|
leonid Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
|
Re: Инверсия символьной строки | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Проверил - работает, и очень быстро!
Спасибо!.. "Непонятно, но здорово!.." (C) |
Re: Инверсия символьной строки | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
В VFP есть SYS(2600, ...) - читатель/записыватель байтов в памяти ОС. Немного поступившись быстродействем ассемблера, можно сделать и через нее. Дело в том, что фокс, похоже, при операции x = X + "A", где x - строка, похоже заново резервирует память для строки x копирует в нее старое содержимое + новый байт. Это конечно тормоза. При помощи SYS(2600... подобное можно выполнять на порядок быстрее фоксового сумматора строк. Т.е.:
- выделяем память в ОС (размером в выходную строку = входной Y), получаем ее адрес A - пишем в адрес A+0 последний символ из исходной строки B (SUBSTR(y, LEN(y)-0, 1) - пишем в адрес A+1 последний символ из исходной строки B (SUBSTR(y, LEN(y)-1, 1) ... повторить по количеству символов Y Уверяю, что будет на порядок быстрее, чем фоксовые же: x = x + SUBSTR(y, ...) (но медленнее, чем ассемблер) |
Re: Инверсия символьной строки | |
---|---|
WbrErr Сообщений: 1960 Дата регистрации: 05.12.2006 |
А в VBA есть функция StrReverse.
|
Re: Инверсия символьной строки | |
---|---|
Simple777 Автор Сообщений: 33855 Дата регистрации: 05.11.2006 |
Интересно, будет ли эта функция работать быстрее/медленнее, чем из VFP с ассемблерной вставкой?
|
Re: Инверсия символьной строки | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Для небольших строк конечно сгодится и так, но в общем случае эффективней обрабатывать строку не побайтово, а двордами. Можно использовать вот такой цикл (esi указывает на последний дворд исходной строки, edi - на начало результирующей, 32-битный код) lodsd bswap eax stosd sub esi,8 Естественно, не надо забывать про "хвост" в случае когда длина строки не кратна 4 |
Re: Инверсия символьной строки | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Чисто по терминологии. Нету тут никакой "ассемблерной вставки". Тут таки простая виндовская апишность как бы. А ассемблерная или уж какая иная "вставка" - было бы нечто совсем иное. Да и вызывалось бы по иному. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Инверсия символьной строки | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Тут имеет место вставка машинного кода, который, очевидно, получен из соответствующего ассемблерного исходного кода - возможно, используя ту или иную программу-ассемблер, а возможно и просто "вручную", благо команд там всего-ничего
ВинАПИ используется исключительно в качестве небольшого трюка для вызова этого машинного кода, т.к. "напрямую" фокс не позволяет вызывать ничего этакого. ------------------ WBR, Igor |
Re: Инверсия символьной строки | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Если так рассуждать, то и фокс служит всего лишь для "вызова машинного кода". ;) Вообще говоря, "машинный код" - как раз таки наиболее близок лишь к ассемблеру (было дело, писал немного и на первом и на втором), разве что ассемблер содержит много "ненужной" информации, связанной с именованием команд, а так, местами в чем-то даже схожи. И если так уж строго подходить, в dll скорее всего "содержится" даже и не ассемблерный код, а что-нибудь вроде сишной программки. Сомневаюсь, что ассемблер вообще использовался при написании винды. Ну может в каких-то редких случаях. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Инверсия символьной строки | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Жжошь |
Re: Инверсия символьной строки | |
---|---|
pasha_usue Сообщений: 3647 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Жжот, конечно. Но мысль, в общих чертах, верная. Машинного кода скомпилированного из исходников на ассемблере, действительно очень немного. А вот машинного кода, скомпилированного из исходников на C (C++), действительно большинство. И компилятор C++ скомпилирован компилятором C++. |
Re: Инверсия символьной строки | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Это если говорить про платформу PC. Хотя, например, первую версию ядра линукса Торвальдс сделал целиком на ассемблере - других средств у него просто не было. А если взглянуть шире, то существует огромное количество всяких контроллеров с крайне ограниченными ресурсами, где другого выбора, кроме ассемблера, быть не может. Исправлено 1 раз(а). Последнее : spinz, 10.01.17 12:10 |
Re: Инверсия символьной строки | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну ты это тетке скажи, которая сидит за вордом и косынкой с пауком, много ей контроллеров-то надо. Тем более речь тут шла только о винде и фоксе в задачке с обращением строки, где решение использует виндовскую функцию. Найди там ассемблер. Хотя, если бы скажем написать на ассемблере функцию обращения и подгружать в фокс, возможно тоже было бы неплохо. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Инверсия символьной строки | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ещё раз - "виндовые функции" в примере Леонида используются для выделения памяти под блок кода, и для вызова этого самого блока кода. Сам же код представлен в виде машинного кода. И это
Именно это он и делает. ------------------ WBR, Igor |
Re: Инверсия символьной строки | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну так бы и сказал.
[attachment 26848 hqdefault.jpg] ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Инверсия символьной строки | |
---|---|
Taran Сообщений: 13623 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Не в обиду Леониду, но для осторожности новых. Как-то использовал расчет MD5 (а может SHA1 не помню) по аналогичной схеме от Леонида. Программа теневая крутится сутки напролет. Примерно на пятые сутки вылетала. Заменил этот расчет на чистое API - перестало. Видимо где-то утечка. |
Re: Инверсия символьной строки | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
И на Солнце есть пятна...))
|
© 2000-2024 Fox Club  |