ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

20.09.2009, 20:14
|
|
Познающий
Регистрация: 02.06.2009
Сообщений: 67
Провел на форуме: 237284
Репутация:
54
|
|
Сообщение от Kuzya
Здравствуйте. Нужно узнать количество вхождений подстроки в строку. Есть ли для этого в Delphi специальная отдельная функция?
И ещё. Есть ли в Delphi встроеная функция на подобие explode() или split()?
UPDATE: Функция типа split найдена - ExtractStrings
Код:
function PosCount(const Substr, Str: string): Integer;
var
i, p: Integer;
s: string;
begin
s := Str;
Result := 0;
for i := 1 to Length(s) do
begin
p := Pos(Substr, s);
if p <> 0 then Inc(Result);
Delete(s, 1, p);
end;
end;
|
|
|

20.09.2009, 21:23
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
2 Nullsleep твой код конечно очень наглядный, но увы очень медленный ((
Работа со строками в делфи - это очень медленная вешь. Вот банальный пример.
Твоя функция(PosCount) - основанная на работе со строка и
моя(mPosCount) основанная на работе с память. ПРи больших размерах строки скорость реально заметна.
Код:
function PosCount(const Substr, Str: string): Integer;
var
i, p: Integer;
s: string;
begin
s := Str;
Result := 0;
for i := 1 to Length(s) do
begin
p := Pos(Substr, s);
if p <> 0 then Inc(Result);
Delete(s, 1, p);
end;
end;
function mPosCount(const Substr, Str: string): Integer;
var
s: pchar;
len: integer;
sublen: integer;
begin
s := @str[1];
sublen := length(substr);
len := length(str) - sublen + 1;
result := 0;
while len > 0 do
begin
if CompareMem(s, @substr[1], sublen) then
begin
inc(result);
len := len - sublen;
s := s + sublen;
end
else
begin
dec(len);
inc(s);
end;
end;
end;
И вот тестирование работы:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
s1,s2:string;
start, stop:dword;
cnt:integer;
begin
s1 := 'dfgdfklgjkfdg8fdg8f0dg09g0f9d0g';
s2 := '';
for x:=1 to 20000 do s2:=s2+s1;
start := GetTickCount;
cnt := mPosCount(s1, s2);
stop := GetTickCount;
memo1.Lines.Add(inttostr(stop - start));
memo1.Lines.Add('CNT: '+inttostr(cnt));
start := GetTickCount;
cnt := PosCount(s1, s2);
stop := GetTickCount;
memo1.Lines.Add(inttostr(stop - start));
memo1.Lines.Add('CNT: '+inttostr(cnt));
end;
Результаты видны сразу
0
CNT: 20000
1578
CNT: 20000
т.е. мой код данные действия сделал меньше чем за 1 микросекунду.
А твой код делал 1578 микросекунд что примерно равно 1,5 секунды
При кол-во повторов 100k мой код выполнил данные действия также меньше микросекунды (иногда 16 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать.
Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.
|
|
|

20.09.2009, 22:31
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Интересная зависимость при тестировании скорости работы со строками.
CNT: 5000 - 94
CNT: 10000 - 406
CNT: 20000 - 1578
CNT: 40000 - 6297
т.е. видно что увеличении длинный строки в 2 раза уменьшает скорость в 4 раза.
CNT: 80000 - 35609 - хотя я хз почему тут не в 4 раза больше предыдущего а в 5,7 раз.
Вот так вот и доверяй делфи и её скорости. Если работать с память то скорость выходит:
CNT: 10 000 000 - 407
как видно что за 407 микросекунд тут обработалось 10 миллионов повторов, в на строках тока 10 тысяч.
Вот и выходит что разница по скорости - в 1000 раз.
|
|
|

20.09.2009, 22:41
|
|
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме: 41202
Репутация:
0
|
|
Подскажите как можно получить код изображения под делфи ?
Вот короткий пример формы куда будет вставлятся изображение:
Код:
object Form1: TForm1
Left = 0
Top = 0
BorderStyle = bsNone
ClientHeight = 413
ClientWidth = 549
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 0
Top = 0
Width = 549
Height = 413
Align = alClient
Picture.Data = {код изображения}
ExplicitWidth = 553
ExplicitHeight = 378
end
end
Может немного тупой вопрос ... но не судите строго, я только начал разбираться в делфях ...
|
|
|

20.09.2009, 23:43
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
так в image есть свойство Picture и там выбирается картинка.
А тут(в исходнике формы) таже самая картинка только переведенная в hex
можеш взять WinHex и перевести сам. Вот тока там скорее всего не сама может быть картнка а уже готовый битмап
|
|
|

21.09.2009, 11:25
|
|
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме: 41202
Репутация:
0
|
|
Картинка в исходнике примерно в таком виде была :
Код:
0A544A504547496D616765B4090100FFD8FFE000104A46494600010101006000
600000FFDB0043000503040404030504040405050506070C08070707070F0B0B
скопировал пару строчек ...
попробовал рисунок в hex перевести ... и форма что то не компилится ... видимо что то не так.
|
|
|

21.09.2009, 11:27
|
|
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме: 41202
Репутация:
0
|
|
PS: строчки в сорце слитно написаны ... форум их разбил на 2 столбца
|
|
|

21.09.2009, 13:45
|
|
Познающий
Регистрация: 15.07.2009
Сообщений: 71
Провел на форуме: 520157
Репутация:
35
|
|
toxa001, я правильно тебя понял тебе надо сохранить рисунок с формы или что? Если так, то это проще сделать открыв в эту форму в delphi, и где загружается картинка есть кнопочка 'сохранить', насколько я помню)
|
|
|

21.09.2009, 13:59
|
|
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме: 41202
Репутация:
0
|
|
мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
|
|
|

21.09.2009, 14:17
|
|
Познающий
Регистрация: 15.07.2009
Сообщений: 71
Провел на форуме: 520157
Репутация:
35
|
|
Сообщение от toxa001
мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
В контроле TImage есть свойство Picture кликни в этом поле 2 раза появится окно загрузки картинки далее думаю понятно все)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|