Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Зависает программа на for


Автор: LorDo 30.6.2013, 14:14
При выполнения части моего кода, который находится ниже программа зависает.
В  чем проблема ?

В массиве ArrayList находятся несколько элементов типа
[0] YzVkZDY3Nzg3MjFhYzJiNjI4YzRmYmE3NDExNDAxODE6VmlydHVhbEJveC5leGU6VmlydHVhbEJveA==
[1] NDlhN2IwZDFjM2Q4M2NiMjlmMWRjN2Y0NjZjMTEwZWE6b2xseWRiZy5leGU6b2xseWRiZw==

В расшифрованном виде
[0] c5dd6778721ac2b628c4fba741140181:VirtualBox.exe:VirtualBox
[1] 49a7b0d1c3d83cb29f1dc7f466c110ea:ollydbg.exe:ollydbg

По идее, код расшифровывает каждый элемент из ArrayList из зашифрованного вида base64 и разбивает на массив строку через разделитель :

Код

var
  ArrayList:Array of String;
  ArrayDynamic:Array of String;
  StrngDynamic:String;
  HTML: string;
  i:integer;
begin
 
  {заполнение ArrayList}

  for i := Low(ArrayList) to High(ArrayList) do
   begin
    StrngDynamic:='';
    FillChar(ArrayDynamic, SizeOf(ArrayDynamic), #0);
    
    StrngDynamic:= DecodeBase64(ArrayList[i]);
    ArrayDynamic:= explode(StrngDynamic, ':');
   end;



Вот функции использующиеся в этом кусочке кода
Код

function DecodeBase64(Value: String): String;

  function DecodeChunk(const Chunk: String): String;
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0; Result := '';
    for i := 1 to 4 do
      if Pos(Chunk[i], b64alphabet) <> 0 then
        W := W + Word((Pos(Chunk[i], b64alphabet) - 1)) shl ((4 - i) * 6);
    for i := 1 to 3 do
      Result := Result + Chr(W shr ((3 - i) * 8) and $ff);
  end;

begin
  Result := '';
  if Length(Value) mod 4 <> 0 then Exit;
  while Length(Value) > 0 do
  begin
    Result := Result + DecodeChunk(Copy(Value, 0, 4));
    Delete(Value, 1, 4);
  end;
end;

function Explode(S: String; Delimiter: Char): ReturnArray; overload;
var I, C: Integer; P, P1: PChar;
begin
    SetLength(Result, 0);
    if Length(S) = 0 then Exit;
    P:=PChar(S+Delimiter); C:=0;
    while P^ <> #0 do begin
       P1:=P;
       while (P^ <> Delimiter) do P:=CharNext(P);
       Inc(C);
       while P^ in [#1..' '] do P:=CharNext(P);
       if P^ = Delimiter then begin
          repeat
           P:=CharNext(P);
          until not (P^ in [#1..' ']);
       end;
    end;
    SetLength(Result, C);
    P:=PChar(S+Delimiter); I:=-1;
    while P^ <> #0 do begin
       P1:=P;
       while (P^ <> Delimiter) do P:=CharNext(P);
       Inc(I); SetString(Result[I], P1, P-P1);
       while P^ in [#1..' '] do P:=CharNext(P);

       if P^ = Delimiter then begin
          repeat
           P:=CharNext(P);
          until not (P^ in [#1..' ']);
       end;
    end;
end;


Автор: northener 30.6.2013, 15:50
Цитата(LorDo @  30.6.2013,  14:14 Найти цитируемый пост)
Copy(Value, 0, 4)

Что это такое?

Автор: LorDo 30.6.2013, 15:53
Цитата(northener @ 30.6.2013,  15:50)
Цитата(LorDo @  30.6.2013,  14:14 Найти цитируемый пост)
Copy(Value, 0, 4)

Что это такое?

Честно говоря, я не сильно вникал в работу фукции DecodeBase64, нашел её на просторах форума, и она отлично работает.

Автор: northener 30.6.2013, 16:07
Цитата(LorDo @  30.6.2013,  15:53 Найти цитируемый пост)
Честно говоря, я не сильно вникал в работу фукции DecodeBase64

А ты для начала попробуй вникни в параметры функции Copy.

Автор: LorDo 30.6.2013, 16:22
Цитата(northener @ 30.6.2013,  16:07)
Цитата(LorDo @  30.6.2013,  15:53 Найти цитируемый пост)
Честно говоря, я не сильно вникал в работу фукции DecodeBase64

А ты для начала попробуй вникни в параметры функции Copy.

Фишка в том что бог с ней с этой функцией явно не из за неё for залипает, если убрать расшифровку эффект тот же.

Автор: northener 30.6.2013, 16:41
Цитата(LorDo @  30.6.2013,  16:22 Найти цитируемый пост)
Фишка в том что бог с ней с этой функцией

А какой смысл отлаживать программу плюя на очевидные ошибки?


Цитата(LorDo @  30.6.2013,  16:22 Найти цитируемый пост)
не из за неё for залипает, если убрать расшифровку эффект тот же

Используй отладчик для поиска причины зависания.

Автор: MetalFan 1.7.2013, 10:00
Цитата(LorDo @  30.6.2013,  15:53 Найти цитируемый пост)
Честно говоря, я не сильно вникал в работу фукции DecodeBase64, нашел её на просторах форума, и она отлично работает. 

Странно, зачем тащить в свой код непонятно кем написанные функции... если все, что нужно, и так уже есть в "комплекте". Правда в крайних версиях делфи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)