Форум » [x]Harbour » Есть ли аналог функций? » Ответить

Есть ли аналог функций?

finder: интересует аналог для функций 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

Ответов - 9

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

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

Pasha: Это функции из ct. и, поскольку главная цель харбора - обеспечить совместимость с клиппером, их поведение такое же, как в клиппер-тулз. Если конечно какие-то несовместимости еще не выявлены, но это вряд ли, учитывая солидный возраст харбора, уже 20 лет как никак. По этой причине менять функциональность этих функций не будут Надо делать свои аналоги. Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен: pos=rat(in,str) if pos>0 str=substr(str, pos+len(in)) endif можно конечно сделать реализацию на C, но особого смысла в этом нет


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

finder: Pasha пишет: Что касается исходного поста, то можно сделать по другому, там оператор str=left(str,pos-1) наверное не нужен: pos=rat(in,str) if pos>0 str=substr(str, pos+len(in)) endif ну там 2 варианта собственно для 2=х функций указаны просто сквозняком AFTERATNUM() и BEFORATNUM()

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

finder: вобщем сделал себе пока 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().

finder: Петр пишет: hb_RAt( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos это позволяет указать с и по какую позицию в строке искать вхождение и не имеет никакого отношения к поиску X вхождения, смысл этого мне непонятен, но так работает в любом случае вопрос снимается, я его для себя уже решил



полная версия страницы