[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Code:
    delete(all, Pos(res, all), 1);
    
    Последний параметр функции delete - это длина подстроки для удаления начиная с позиции удаления. Если тебе нужно удалить рандомный символ, то его длина БУДЕТ 1, в силу того, что по определению символ не может быть длиной больше одного, т.к в этом случаи это уже не символ, а подстрока. В противном случаи ты обрезаешь всю строку all до твоего рандомного символа.

    Пример:

    Предположим, что строка all равна сл. значению:

    all := 'abcdefghi';

    Рандом пускай выдал позицию символа 'e'; То есть res := 'e'; n = 5;

    Если делать так:
    delete(all,Pos(res,all), Pos(res,all) + 1);

    То из строки all удалится 6 символов начиная с 5 позиции. То есть значение строки all в результате окажется 'abcd', вместо 'abcdfghi'.

    Учите банальную алгоритмизацию. Это не дело. :)
     
    #9501 muip, 15 Jan 2014
    Last edited: 15 Jan 2014
  2. WendM

    WendM Member

    Joined:
    29 Jan 2012
    Messages:
    44
    Likes Received:
    7
    Reputations:
    3
    muip, верно сказал. Перепутал малясь)
     
  3. Testosteron

    Testosteron New Member

    Joined:
    18 Jun 2010
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    WendM Спасибо за ответ)
    Проблема как оказалось была не в этом.
    Я новичок поэтому не ругайте сильно)
    Для авторизации на сайте есть такой параметр как ajax=true, так вот если его передавать то перестает парсить ответ. Почему так и как это обойти?
    Заранее спасибо.
     
  4. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    muip , я пробовал это )) Как хочешь пробовал, функция просто не реагирует..
     
  5. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Возможно ты не проинициализировал random. При использовании функции random нужно вызывать процедуру randomize;

    Вызывать ее нужно один раз. Если random используешь в объекте класса TForm, то процедуру нужно вызвать в любом методе этого класса, если random используешь в потоке, то randomize вызывать соответственно в потоке.
     
  6. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    В HTTP.Response.ResponseText будут только заголовки ответа. То есть какой-то такой вид:

    Code:
    HTTP/1.1 200 OK
    Server: nginx/1.2.4
    Date: Wed, 15 Jan 2014 17:54:17 GMT
    Content-Type: text/plain; charset=windows-1251
    Content-Length: 1050
    Connection: keep-alive
    X-Powered-By: PHP/3.4151
    Pragma: no-cache
    Cache-control: no-store
    Content-Encoding: gzip
    
    Твоя строка {"action":"needLogin","success":true,"message" не похожа на элемент заголовка, поэтому ее нужно парсить/проверять в самом теле ответа, то есть из примера WendM'а нужно проверять в переменной html:


    Code:
    if Pos('{"action":"needLogin","success":true,"message"', html)<>0 then
    
     
  7. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    С randomize все в порядке.
     
  8. Testosteron

    Testosteron New Member

    Joined:
    18 Jun 2010
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Protocoler Спасибо)
    Так-же ещё нашел ошибку, не был создан поток)
    Теперь все работает. :)
     
    #9508 Testosteron, 16 Jan 2014
    Last edited: 16 Jan 2014
  9. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    НЕ 1, а 0 . Счет начинается с 0
     
  10. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    Вопрос остается в силе, хелп. Буду очень благодарен.

    Неверно работает. Должен в result выводить перемешанные символы из all .
    Code:
    all:=str+coun+strU;
           //
           str:='';
           coun:='';
           strU:='';
           //
           for v:=0 to 8 do
     begin
    
            res:=all[random(Length(all))+1];
            result:=result+res;
            if Pos(res,all)>0 then
            delete(res,Pos(res,all),Pos(res,all)+1);
            res:='';
    end;
            mmo1.lines.Add(result);
    
    
     
  11. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    Protocoler, вообще не улавливаю логику работы. ты же в res закидаешь один символ, потом используешь функцию Pos скорее всего неправильно (Pos(substr, str) - возвращает первое вхождение подстроки substr в строку str, потому у тебя условие всегда возвращает true) и удаляешь непонятное количество символов начиная с хрен знает какой позиции, хотя res хранит только один символ...
     
  12. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    Так, нашел ошибку. Спасибо. А то голова совсем не варит уже..
    исправил delete не от туда удалял, но всеравно не так... хм..
    Как должно работать
    строка all в которой 9 символов,
    в цикле res рендомно получает 1 символ из all , вставляет его в result и этот символ удаляет из all чтобы снова его рендом не словил. И так до конца. НО пример :
    gqv85OYHZ - изначально all

    vHqgggggg - прога выдает в конце как результат
    Получается что не верно работает delete . При
    if Pos(res,all)>0 access violetion вылетает, значит логика не правильная если > 1 то все норм. Бляя.. Хелп
    Code:
    all:=str+coun+strU;
           //
           str:='';
           coun:='';
           strU:='';
           //
           mmo1.lines.Add(all); // проверочка
           for v:=0 to 8 do
     begin
    
            res:=all[random(Length(all))+1];
            result:=result+res;
            if Pos(res,all)>1 then
            delete([COLOR=Yellow]all[/COLOR],Pos(res,all),Pos(res,all)+1);
            res:='';
    end;
            mmo1.lines.Add(result);
    
     
  13. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    Protocoler, для delete 3-им параметром передается количество удаляемых символов, в твоем случае должно быть 1, то есть
    Code:
    delete(all,Pos(res,all),[COLOR=Red]1[/COLOR]);
    
     
  14. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    та это я уже исправил как поменял res на all . Но всеравно не работает... какая-то банальная ошибка я уверен, но голова уже болит думать.
     
  15. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    надеюсь про randomize ты не забыл? ;)

    update. нащел выше, что randomize есть. тогда - хз, я брал твой код, добавил randomize и исправил ошибку с delete - и все заработало как надо
     
    #9515 qw1mb1, 22 Jan 2014
    Last edited: 22 Jan 2014
  16. WendM

    WendM Member

    Joined:
    29 Jan 2012
    Messages:
    44
    Likes Received:
    7
    Reputations:
    3
    Protocoler я же тебе уже давно указал правильный вариант
    http://forum.antichat.ru/showpost.php?p=3654297&postcount=9525
     
  17. Protocoler

    Protocoler Elder - Старейшина

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    Всеравно не верно работает

    rec71XEEM - строка all изначально
    7rcEEX - результат который вышел, хотя должно было по сути просто перемешать символы
     
  18. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Protocoler, можно как-то так без copy и delete перемешать символы для строки длиной не более 31 символа:
    Code:
    function getRandomStr(const Src: String): String;
    var
      id, iSet, cdLen: Cardinal;
    begin
      Randomize;
      cdLen:= Length(Src);
      if (cdLen > 31) then cdLen:= 31;
      iSet:= not ($FFFFFFFF shl cdLen);
    
      while True do begin
    
        id:= Random(cdLen);
        if (((iSet shr id) and 1) = 1) then begin
    
          iSet:= iSet and not (1 shl id);
          Result:= Result + Src[id+1];
        end;
        if (iSet = 0) then Break;
      end;
    end;
     
  19. DJ_TWIX

    DJ_TWIX Banned

    Joined:
    17 Jan 2014
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    [​IMG]
    У кого есть этот киллер снифферов?
     
  20. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Этого киллера нет, но написал по-своему:

    Code:
    program ProcessGuard;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      Windows,
      TlHelp32;
    
    // by Stas'M (aka binarymaster)
    
    type
      TProcessEntry = record
        PID: DWORD;
        Name: String;
      end;
      TProcessList = Array of TProcessEntry;
    
    procedure WriteToLog(S: String);
    var
      Timestamp: String;
    begin
      DateTimeToString(Timestamp, 'yyyy.mm.dd hh:mm:ss', Now);
      S := '[' + Timestamp + '] ' + S;
      Writeln(S);
    end;
    
    procedure GetProcessList(var ProcList: TProcessList);
    var
      hSnapshot: THandle;
      pe32: TProcessEntry32;
    begin
      SetLength(ProcList, 0);
      hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if (hSnapshot = INVALID_HANDLE_VALUE) then
        Exit;
      pe32.dwSize := SizeOf(TProcessEntry32);
      if Process32First(hSnapshot, pe32) then
        repeat
          SetLength(ProcList, Length(ProcList) + 1);
          ProcList[Length(ProcList) - 1].PID := pe32.th32ProcessID;
          ProcList[Length(ProcList) - 1].Name := pe32.szExeFile;
        until not Process32Next(hSnapshot, pe32);
      CloseHandle(hSnapshot);
    end;
    
    function KillByPID(PID: DWORD): Boolean;
    var
      hProc: THandle;
    begin
      Result := False;
      hProc := OpenProcess(PROCESS_TERMINATE, False, PID);
      if hProc = 0 then
        Exit;
      Result := TerminateProcess(hProc, 0);
      CloseHandle(hProc);
    end;
    
    function KillByWindow(ClassName, WindowName: PWideChar): Boolean;
    var
      Wnd: HWND;
      PID: DWORD;
    begin
      Result := False;
      Wnd := FindWindow(ClassName, WindowName);
      if Wnd = 0 then
        Exit;
      if GetWindowThreadProcessId(Wnd, PID) = 0 then
        Exit;
      if PID = 0 then
        Exit;
      Result := KillByPID(PID);
      if Result then
        WriteToLog('Process #' + IntToStr(PID) + ' killed by window ('+ClassName+', '+WindowName+').');
    end;
    
    function KillByName(Name: String; var ProcList: TProcessList): Boolean;
    var
      I: Integer;
    begin
      Result := False;
      Name := LowerCase(Name);
      for I := 0 to Length(ProcList) - 1 do
        if LowerCase(ProcList[I].Name) = Name then begin
          Result := KillByPID(ProcList[I].PID);
          if Result then
            WriteToLog('Process #' + IntToStr(ProcList[I].PID) + ' killed by name ('+Name+').');
        end;
    end;
    
    var
      ProcList: TProcessList;
    begin
      try
        { TODO -oUser -cConsole Main : Insert code here }
        while True do begin
          GetProcessList(ProcList);
    
          // Your processes here
          KillByName('miniperl.exe', ProcList);
          KillByName('httpd.exe', ProcList);
          KillByName('mysqld.exe', ProcList);
          KillByName('ollydbg.exe', ProcList);
          KillByName('HttpAnalyserStdV7.exe', ProcList);
          KillByName('HttpAnalyserStdV6.exe', ProcList);
          KillByName('HttpAnalyserStdV5.exe', ProcList);
          KillByName('Charles.exe', ProcList);
          KillByName('wireshark.exe', ProcList);
    
          // Your windows here
          KillByWindow(nil, 'HTTP Analyzer V6');
          KillByWindow(nil, 'HTTP Analyzer V5');
          KillByWindow(nil, 'HTTP Analyzer V7');
          KillByWindow(nil, 'OllyDbg');
          KillByWindow(nil, 'Charles 3.6');
          KillByWindow(nil, 'httpd.exe -w');
    
          Sleep(10);
        end;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
     
Thread Status:
Not open for further replies.