WTF Funkcja copy w lazarusie

0

Witam
Mam dość dziwny błąd w Lazarusie - w Delphi działa dobrze...

 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  hash,s:string;
begin
  Hash:='d41d8cd98f00b204e9800998ecf8427e';

  for i:=0 to 4 do
  begin
    s:=Copy(Hash,(i*4)+1,4);
  end;
end;

Problem w tym, że ten kawałek kodu nie działa :| żeby było śmieszniej gdy zamienię zmienną i na sztywne 0 w kodzie to wszystko działa.
Wie ktoś co jest grane?

0

a co to miałoby wg. ciebie robić?

0

kopiować część hasha do s - włącz pod debuggerem to zobaczysz co mam na myśli, albo dodaj jakiś ShowMessage za pętlą

0

A Ty wiesz że z każdym z 5 wywołań pętli do s zapisuje się nowa wartość? Czyli poprzednia się wymazuje.

for i:=0 to 4 do
  begin
    s:=Copy(Hash,(i*4)+1,4);
  end;

jest równe z

s:=Copy(Hash,(i*4)+1,4);
0

tak wiem głupi przykład dałem

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  hash,s:string;
begin
  Hash:='d41d8cd98f00b204e9800998ecf8427e';
 
  for i:=0 to 4 do
  begin
    s:=Copy(Hash,(i*4)+1,4);
    ShowMessage(s);
  end;
end;

ale chodzi o to, że gdy napisze po prostu tak:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  hash,s:string;
begin
  Hash:='d41d8cd98f00b204e9800998ecf8427e';
 
  for i:=0 to 4 do
  begin
    s:=Copy(Hash,(0*4)+1,4);
    ShowMessage(s);
  end;
end;

To komunikat się pojawi - dodam, że obie wersje działają jak trzeba w Delphi a w Lazarusie tylko ta druga. Chyba, że mam jakąś upośledzoną wersję 1.0 RC1 w której ten błąd występuje bo to chyba błąd kompilatora. Może ktoś potwierdzić albo zaprzeczyć? Po dojściu do linijki

 s:=Copy(Hash,(i*4)+1,4);

Debugger wyskakuje poza funkcję

0

Coś się crashuje w tej funkcji.
Zaraz obejrzę dokładniej...


Edit: ```delphi {$MODE OBJFPC} {$H+} Var I : Integer; Hash, S: String; Begin Hash := 'd41d8cd98f00b204e9800998ecf8427e';

For I := 0 To 4 Do
Begin
S := Copy(Hash, (I*4)+1, 4);
Writeln(S);
End;

Readln;
End.

W konsoli działa poprawnie...
<hr>
Edit2: w "okienkach" także jest wszystko ok.
Lazarus 0.9.30.4
0

Wiem że może mało optymalne rozwiązanie, ale ja zamiast tracenia, powiedzmy pół godzin na szukanie rozwiązania, zrobiłbym tak.

var
  Hash, tmp, tmp2, s: String; 
  I, J: Integer;
begin
  Hash := 'd41d8cd98f00b204e9800998ecf8427e';
  tmp := Hash;

  for I := 0 to 4 do
  begin
    Delete(tmp, 0, 4);
    for J := 1 to 4 do
      tmp2 := tmp2 + tmp[J];
    s := tmp2;
    //...
    ShowMessage(s);
  end;
end;
0

kopiować część hasha do s - włącz pod debuggerem to zobaczysz co mam na myśli, albo dodaj jakiś ShowMessage za pętlą

U mnie działa ok.
Debugger u mnie źle wyświetla numer linii po procedurze copy (wskazuje na koniec procedury Buttona), ale jest to tylko błąd w symbolach (jedna z linii asma nie wskazuje na żadną linię procedury) i nie ma wpływu na działanie tylko debugger się dziwi.

Jak chodzi ci o coś innego niż debugger źle wskazujący linię to podaj przykład to zobaczę o co chodzi i jak trzeba to zareportuję. Wydaje mi się że błąd debuggera jest już zgłoszony, ale potem się rozejrzę i jak będzie trzeba to zrobię jakiś test.

0

Heh dziwne bo teraz działa i bez tych dyrektyw

function TCrackTasks.HashToByte(Hash: string): TMD5Digest;
{$MODE OBJFPC}
{$H+}
var
  i:integer;
  s:string;
  ByteHash: TMD5Digest;
begin
  for i:=0 to 15 do
  begin
    s:=Copy(Hash,(i*2)+1,2);
    ByteHash[i]:= StrToInt('$'+s);
  end;
  Result:=ByteHash;
end; 

To moja już gotowa metoda. Problem polegał na tym, że zmienna s miała wart. "" po użyciu Copy w pętli oraz użyciu zmiennej sterującej pętlą for jako 1 parametr.
Jeśli zamiast zmiennej sterującej była na sztywno wpisana liczba to funkcja zwracała to co chciałem - nie potrafię teraz tego odtworzyć.

0

To moja już gotowa metoda. Problem polegał na tym, że zmienna s miała wart. "" po użyciu Copy w pętli oraz użyciu zmiennej sterującej pętlą for jako 1 parametr.

Debugger mógł odwalać jeżeli miałeś ustawione wysokie poziomy optymalizacji. Przy niższych często wynika to z tego że jest wybrane inne miejsce w Call stacku (s to popularna nazwa zmiennej, okazuje się że np. FPC_RaiseException też używa tej zmiennej i można mieć niezły zonk).

function TCrackTasks.HashToByte(Hash: string): TMD5Digest;
{$MODE OBJFPC}
{$H+}

Nie wiem czy nie lepiej stosować te dyrektywy na górze, w tym miejscu mogą one nie mieć efektu/powodować problemy.

TMD5Digest

Lepsze niż stary moduł MD5 jest DCP, MD5 czystego używam tylko gdy nie trzeba innych funkcji hashujących/szyfrujących.

1 użytkowników online, w tym zalogowanych: 0, gości: 1