реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Делфи. Ищу функцию типа Pos(s1,s2), но со стартом поиска не с 1 символа
AHTOXA
сообщение Jan 23 2012, 17:15
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вот, нашёл, strutils специально для D5: тыц!


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:16
Сообщение #17


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 22:13) *
не советую. в 7-й версии заметно откорректирована библиотека VCL, через которую и происходили основные утечки. ПОЧТИ все дырки были устранены. так что приклеивать к 5-й версии что-то другое, тем более от FreePascal не советую. что советую - уже говорил.

Функция Pos() и PosEx() не выделяют и не освобождают память. Утечка им не страшна. Главное, чтобы формат строк был тот же, а он тот же.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 17:16
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(AHTOXA @ Jan 23 2012, 23:15) *
Вот, нашёл, strutils специально для D5


Гы! Сделано через StrPos! sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:23
Сообщение #19


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(AHTOXA @ Jan 23 2012, 22:10) *
Да нет жеsm.gif Это просто указатель на char. Мы его наводим на первый символ строки. И начинаем по ней елозить. Всё.

А откуда берётся #0 в конце этой же строки, если его там не было?

Цитата(AHTOXA @ Jan 23 2012, 22:15) *
Вот, нашёл, strutils специально для D5: тыц!

Скопировал к себе в проект только одну функцию. Скомпилилась.

Последний вопрос - она точно будет нормально работать со строками с #0-символами, разбросанными по строке? Дальше первого #0 будет продолжаться поиск?

Я чего-то сильно сильно сомневаюсь sad.gif

Сообщение отредактировал GetSmart - Jan 23 2012, 17:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 23 2012, 17:25
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(GetSmart @ Jan 23 2012, 21:16) *
Функция Pos() и PosEx() не выделяют и не освобождают память. Утечка им не страшна. Главное, чтобы формат строк был тот же, а он тот же.

я вам и говорю, что утечки через VCL идут - а она у вас старая, дырявая... вы же жалуетесь на утечки - вот я и советую обновиться на менее дырявую... но дело ваше.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:27
Сообщение #21


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 22:25) *
я вам и говорю, что утечки через VCL идут - а она у вас старая, дырявая... вы же жалуетесь на утечки - вот я и советую обновиться на менее дырявую... но дело ваше.

Ок. Попробую. Спасибо за подсказку.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Jan 23 2012, 17:30
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Цитата(GetSmart @ Jan 23 2012, 19:27) *
Но хотелось бы не делать лишней работы, и узнать заранее что надо, а что не надо.

Моему дилетантскому имху кажется, что при процитированном подходе в первую очередь следует прислушаться к неоднократным советам ARV, а потом уже копать дальше при необходимости.

ЗЫ пока набирал пост, вы уже вняли голосу разума и методологически верной стратегии rolleyes.gif

Сообщение отредактировал _Ivana - Jan 23 2012, 17:32
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 17:32
Сообщение #23


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 23 2012, 23:23) *
А откуда берётся #0 в конце этой же строки, если его там не было?

Вот тут не знаю. Возможно он в string предусмотрен изначально.
Цитата(GetSmart @ Jan 23 2012, 23:23) *
Последний вопрос - она точно будет нормально работать со строками с #0-символами, разбросанными по строке? Дальше первого #0 будет продолжаться поиск?

Если через StrPos - то вряд ли. Иначе как он определит конец строки?
Имхо, проще написать свою функциюsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:53
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 21:41) *
не катите бочку на профессионалов! такая функция есть!

А не подскажете, PosEx из 7-й делфи будет работать со строками с #0 в середине?
Принимаются - Да, Нет, Не знаю sm.gif


Upd
И ещё вопрос:
На страницах HTML 100% гарантируется отсутствие символов #0 ?

Сообщение отредактировал GetSmart - Jan 23 2012, 18:10


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 24 2012, 02:19
Сообщение #25


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Принимаются - Да, Нет, Не знаю
я выбираю вариант "Не знаю"
Но позволю себе немного размышлений...
Кажется формат хранения строк в Delphi отличается от сишного тем, что #0 не должен являться признаком конца строки. Вмместо этого длилна строки известна заранее(кажется хранится в первом байте). Т.е. при использовании типа string - проблемы с нулем скорее всего быть не должно.
В конце концов несложный эксперимент раз и на всегда прояснит ситуацию. Но Delphi сейчас ставить как-то не хочется )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 24 2012, 03:33
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 23 2012, 23:53) *
А не подскажете, PosEx из 7-й делфи будет работать со строками с #0 в середине?
Принимаются - Да, Нет, Не знаю sm.gif

Насчёт седьмой - не скажу, а вот из десятой - будет. Вот оно:
CODE
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The implementation of function PosEx is subject to the
* Mozilla Public License Version 1.1 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Fastcode
*
* The Initial Developer of the Original Code is Fastcode
*
* Portions created by the Initial Developer are Copyright © 2002-2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Aleksandr Sharahov
*
* ***** END LICENSE BLOCK ***** *)
function PosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
asm
test eax, eax
jz @Nil
test edx, edx
jz @Nil
dec ecx
jl @Nil

push esi
push ebx

mov esi, [edx-4] //Length(Str)
mov ebx, [eax-4] //Length(Substr)
sub esi, ecx //effective length of Str
add edx, ecx //addr of the first char at starting position
cmp esi, ebx
jl @Past //jump if EffectiveLength(Str)<Length(Substr)
test ebx, ebx
jle @Past //jump if Length(Substr)<=0

add esp, -12
add ebx, -1 //Length(Substr)-1
add esi, edx //addr of the terminator
add edx, ebx //addr of the last char at starting position
mov [esp+8], esi //save addr of the terminator
add eax, ebx //addr of the last char of Substr
sub ecx, edx //-@Str[Length(Substr)]
neg ebx //-(Length(Substr)-1)
mov [esp+4], ecx //save -@Str[Length(Substr)]
mov [esp], ebx //save -(Length(Substr)-1)
movzx ecx, byte ptr [eax] //the last char of Substr

@Loop:
cmp cl, [edx]
jz @Test0
@AfterTest0:
cmp cl, [edx+1]
jz @TestT
@AfterTestT:
add edx, 4
cmp edx, [esp+8]
jb @Continue
@EndLoop:
add edx, -2
cmp edx, [esp+8]
jb @Loop
@Exit:
add esp, 12
@Past:
pop ebx
pop esi
@Nil:
xor eax, eax
ret
@Continue:
cmp cl, [edx-2]
jz @Test2
cmp cl, [edx-1]
jnz @Loop
@Test1:
add edx, 1
@Test2:
add edx, -2
@Test0:
add edx, -1
@TestT:
mov esi, [esp]
test esi, esi
jz @Found
@String:
movzx ebx, word ptr [esi+eax]
cmp bx, word ptr [esi+edx+1]
jnz @AfterTestT
cmp esi, -2
jge @Found
movzx ebx, word ptr [esi+eax+2]
cmp bx, word ptr [esi+edx+3]
jnz @AfterTestT
add esi, 4
jl @String
@Found:
mov eax, [esp+4]
add edx, 2

cmp edx, [esp+8]
ja @Exit

add esp, 12
add eax, edx
pop ebx
pop esi
end;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2012, 05:27
Сообщение #27


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



AHTOXA, спасибо большое.
Так и вставлю эту функцию в свой прожект, чтоб не мучиться с StrUtils-ом.

Но всё равно любопытно по поводу HTML страниц и #0.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 24 2012, 05:33
Сообщение #28


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 24 2012, 11:27) *
Но всё равно любопытно по поводу HTML страниц и #0.

Я практически на 100% уверен, что там нет нулей. Ибо они формируются и обрабатываются кучей разных программ на сиsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 24 2012, 06:20
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



1. функции, работающие со строками ПАСКАЛЕВСКОГО типа (без нуля в конце) могут содержать в своей середине сколько угодно нулей. в связи с этим PosEx работать будет.
2. увидел - мелькнуло слово HTML... тайна покрыта мраком, но если вы парсите HTML, то снова порекомендую вам JVCL - там в комплекте есть много вещей, которые вам помогут, в том числе функции, которые почти готовы для того, чтобы искать и находить в HTML-тексте нужные теги и т.п. Вы удивитесь: как много в этой библиотеке есть готовых решений! sm.gif
3. если вдруг вам нужно делать поиск и замену, то для этого так же есть готовая библиотечная функция (начиная с 7 версии). очень удобно.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2012, 07:45
Сообщение #30


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(AHTOXA @ Jan 23 2012, 22:32) *
Вот тут не знаю. Возможно он в string предусмотрен изначально.

Действительно, за последним символом Делфа намеренно ставит #0. Обрезая строку на 1 символ несколько раз, на месте обрезанного появляется ноль. А уже за нулём может быть мусор.

Недокументированная фича?

PosEx из десятки отлично работает. Тем более на асме. Самый fast.

Сообщение отредактировал GetSmart - Jan 25 2012, 08:42


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016