ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #4421  
Старый 20.09.2009, 20:14
Nullsleep
Познающий
Регистрация: 02.06.2009
Сообщений: 67
Провел на форуме:
237284

Репутация: 54
Отправить сообщение для Nullsleep с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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;
 
Ответить с цитированием

  #4422  
Старый 20.09.2009, 21:23
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать.

Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.
 
Ответить с цитированием

  #4423  
Старый 20.09.2009, 22:31
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Интересная зависимость при тестировании скорости работы со строками.

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 раз.
 
Ответить с цитированием

  #4424  
Старый 20.09.2009, 22:41
toxa001
Новичок
Регистрация: 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
Может немного тупой вопрос ... но не судите строго, я только начал разбираться в делфях ...
 
Ответить с цитированием

  #4425  
Старый 20.09.2009, 23:43
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

так в image есть свойство Picture и там выбирается картинка.
А тут(в исходнике формы) таже самая картинка только переведенная в hex
можеш взять WinHex и перевести сам. Вот тока там скорее всего не сама может быть картнка а уже готовый битмап
 
Ответить с цитированием

  #4426  
Старый 21.09.2009, 11:25
toxa001
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме:
41202

Репутация: 0
По умолчанию

Картинка в исходнике примерно в таком виде была :
Код:
      0A544A504547496D616765B4090100FFD8FFE000104A46494600010101006000
      600000FFDB0043000503040404030504040405050506070C08070707070F0B0B
скопировал пару строчек ...

попробовал рисунок в hex перевести ... и форма что то не компилится ... видимо что то не так.
 
Ответить с цитированием

  #4427  
Старый 21.09.2009, 11:27
toxa001
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме:
41202

Репутация: 0
По умолчанию

PS: строчки в сорце слитно написаны ... форум их разбил на 2 столбца
 
Ответить с цитированием

  #4428  
Старый 21.09.2009, 13:45
alexey-m
Познающий
Регистрация: 15.07.2009
Сообщений: 71
Провел на форуме:
520157

Репутация: 35
Отправить сообщение для alexey-m с помощью ICQ
По умолчанию

toxa001, я правильно тебя понял тебе надо сохранить рисунок с формы или что? Если так, то это проще сделать открыв в эту форму в delphi, и где загружается картинка есть кнопочка 'сохранить', насколько я помню)
 
Ответить с цитированием

  #4429  
Старый 21.09.2009, 13:59
toxa001
Новичок
Регистрация: 08.07.2008
Сообщений: 9
Провел на форуме:
41202

Репутация: 0
По умолчанию

мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
 
Ответить с цитированием

  #4430  
Старый 21.09.2009, 14:17
alexey-m
Познающий
Регистрация: 15.07.2009
Сообщений: 71
Провел на форуме:
520157

Репутация: 35
Отправить сообщение для alexey-m с помощью ICQ
По умолчанию

Цитата:
Сообщение от toxa001  
мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
В контроле TImage есть свойство Picture кликни в этом поле 2 раза появится окно загрузки картинки далее думаю понятно все)
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Wi-Fi, BT] Задай вопрос - получи ответ! Alexsize Беспроводные технологии/WPAN/WLAN 2567 19.04.2026 23:21
[ *NIX ] Задай вопрос - получи ответ. Xszz *nix 1547 15.06.2010 15:41
[jQuery] - Задай вопрос, получи ответ Isis PHP, PERL, MySQL, JavaScript 62 25.12.2009 03:25
ЕсТь ВоПрос Guma Чаты 4 26.10.2005 21:48



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ