On-line: PSP, tnsr2, гостей 1. Всего: 3 [подробнее..]
АвторСообщение





Пост N: 23
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 11.10.20 16:20. Заголовок: Есть ли аналог функций?


интересует аналог для функций AFTERATNUM() и BEFORATNUM() смысл такой же только поиск с конца строки.
может кому попадалось?

хочется оптимизированную замену конструкции в духе
pos=rat(in,str)
if pos>0
str=left(str,pos-1) // befor rat
str=substr(str, pos+len(in)) // after rat
endif

вроде простые вещи и даже с начала строки есть реализация одной функцией, а чтобы с конца почему то не нашел ничего

или может кто нибудь хорошо понимает внутренности харбора и подкрутить делов на 5 минут...
в харборе они тут harbour-core/contrib/hbct/atnum.c

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 9 [только новые]


Администратор




Пост N: 3982
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.10.20 09:13. Заголовок: Так эти функции как ..


Так эти функции как раз выполняют поиск последнего вхождения, если не задан 3-й параметр: nCounter, т.е. работают как rat()

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 24
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 12.10.20 14:36. Заголовок: согласен пример не с..


согласен пример не совсем удачный привел
да там есть такое и оно работает, но не в том случае когда надо выкусить на вхождении дальше 1
сама суть указанных функций, что можно игнорить нужное число вхождений, слева это работает справа нет, в итоге когда принципиально отрабатывать с конца, приходится кучу кода лепить, хотя сама операция вроде как простая и есть реализованный вариант слева направо.

получается либо надо последовательно грызть кусками строку пока нужное число вхождений не наберется или считать все вхождения и выцеплять нужное описанными функциями или функциями из серии token разбирать собирать - все какое то многопроходное/ресурсоемкое

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3983
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.10.20 15:18. Заголовок: Это функции из ct. и..


Это функции из ct. и, поскольку главная цель харбора - обеспечить совместимость с клиппером, их поведение такое же, как в клиппер-тулз. Если конечно какие-то несовместимости еще не выявлены, но это вряд ли, учитывая солидный возраст харбора, уже 20 лет как никак.
По этой причине менять функциональность этих функций не будут
Надо делать свои аналоги.

Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен:

pos=rat(in,str)
if pos>0
str=substr(str, pos+len(in))
endif

можно конечно сделать реализацию на C, но особого смысла в этом нет

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3984
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.10.20 16:20. Заголовок: В конце концов, можн..


В конце концов, можно получить число вхождений подстроки функцией NumAt.
Затем, исходя из числа вхождений, прямо задавать 3-й параметр функции AfterAtNum
Конечно, это не очень оптимально, но альтернатива - самому ползать по строке и выбирать что надо

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 25
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 12.10.20 20:36. Заголовок: Pasha пишет: Что ка..


Pasha пишет:

 цитата:
Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен:

pos=rat(in,str)
if pos>0
str=substr(str, pos+len(in))
endif


ну там 2 варианта собственно для 2=х функций указаны просто сквозняком
AFTERATNUM() и BEFORATNUM()

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 26
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 12.10.20 20:37. Заголовок: Pasha пишет: В конц..


Pasha пишет:

 цитата:
В конце концов, можно получить число вхождений подстроки функцией NumAt.
Затем, исходя из числа вхождений, прямо задавать 3-й параметр функции AfterAtNum



в том то и дело что 2 прохода будет нерационально

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 27
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 12.10.20 20:50. Заголовок: вобщем сделал себе п..


вобщем сделал себе пока rat с номером вхождения, с отрезанием тоже сделал, но оно вдет себя аномально, не заходят внутренности нормально
может где есть описание встроенных сишных функций?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1583
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.10.20 22:27. Заголовок: Кроме функции RAt( ..


Кроме функции
RAt( <cSearch>, <cString> ) --> nPos
существует еще
hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos

This function searches for last occurrence a <cSearch> in <cString>.
If the function is unable to find any occurrence of <cSearch> in
<cString>, the return value is 0. 3rd and 4th parameters define
inclusive range for 2nd parameter on which operation is performed.
If 3rd and 4th parameters is not specified, then hb_RAt() is equal
to RAt().

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 28
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 13.10.20 19:09. Заголовок: Петр пишет: hb_RAt(..


Петр пишет:

 цитата:
hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos



это позволяет указать с и по какую позицию в строке искать вхождение и не имеет никакого отношения к поиску X вхождения, смысл этого мне непонятен, но так работает
в любом случае вопрос снимается, я его для себя уже решил

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 45
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет