Thema: Delphi DynArray beschädigt

Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: DynArray beschädigt

  Alt 17. Feb 2007, 12:08
Das Memo is kein Dynamisches...Wurde zur Designzeit aufs Formular gesetzt...
Die AV entsteht bei Memo1.Lines.Add(..)
Also meine function funktioniert...irgendwie.....ohne Memo......

Ach ich poste sie einfach mal...


Delphi-Quellcode:
function MLength(I: TIntArray): Integer;
begin
  Result := Length(I);
end;

function KaAsm(cnt: Integer): TIntArray;
asm

  @while1: CMP eax,0
             JE @end
            MOV edx,START
            MOV ecx,0
           PUSH eax //cnt sichern

{ WHILE SCHLEIFE 2 ANFANG }

 @while2 : MOV eax,2 // 2 von
           PUSH edx
           CALL System.@RandInt // ..random(2)
            POP edx
            CMP eax,1 // wenn random(2) = 1

             JE @Sock // springe zu sock
  @NSock : CMP edx,3 // größer 3?
             JA @minus
            JMP @test1
  @Minus : DEC edx // ja also dec(akt)
            JMP @test1
  @Sock : INC edx // inc(akt)
  @test1 : INC ecx
            CMP edx,ZIEL
            JNE @while2

    { WHILE SCHLEIFE 2 ENDE}

           PUSH ecx
            MOV eax,[ebp-$04]
           CALL MLength
            INC eax
            PUSH eax
            LEA eax,[ebp-$04]
            MOV ecx,1
            MOV edx,Result
           CALL System.@DynArraySetLength
            ADD esp,$04

           MOV eax,[ebp-$04]
           CALL MLength
            POP ecx
            SUB eax,1
            MOV edx,eax
            MOV eax,[ebp-$04]
            MOV [eax+edx*$04],ecx
            POP eax
            DEC eax
            JMP @while1

  @end: RET
end;
Vorlage war diese function (Zum Vergleich und leichterem Verständnis):

Delphi-Quellcode:
function KA(Cnt: Integer): TIntArray;
var akt: Integer;
    c: Word;
begin
  while Cnt>0 do
  begin

    Akt:= START;
    C:=0;

    while Akt <> ZIEL do
    begin
      if Random(2)=1 then
        Inc(Akt)
      else if Akt>3 then Dec(Akt);
      Inc(C);
    end;

    SetLength(Result,Length(Result)+1);
    Inc(Result[High(Result)],c);
    Dec(Cnt);
  end;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat