Einzelnen Beitrag anzeigen

hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#4

Re: Absturz in Delphi: Überlauf?

  Alt 21. Feb 2005, 11:00
AAARGHLLL:.....Grad beim Rauskopieren hab ich's gemerkt: Da steht in einer Schleife mal wieder to length(Array) statt to length(Array)-1. GRRRR und dafür debugt man 2 Tage lang....ich poste trotzdem mal etwas code, da ich mich mit dynamischen ARrays nicht wirklich auskenne bisher, vielleicht fällt ja jemandem irgendwas ziemlich dummes auf, was noch eleganter gemacht werden könnte...
Delphi-Quellcode:
type

  TKarte = record
    FarbWert: integer;
    Farbe: String[5];
    PunktWert: Byte;
    Bildwert: Byte;
    Bild: String[5];
    name:string[12];
  end;

  TCardArray = Array of TKarte;
  TDeskArray = Array of TCardArray;

  TPlayer = Record
    Cards:TCardArray;
    ondesk:boolean;
    name:string[30];
  end;
Soweit die Typen, nun die 2 Methoden:

Delphi-Quellcode:
procedure TForm1.removeCard(var cardSet: TCardArray; cardname: string);
var aSize,i,index:integer;
begin
  aSize := length(cardSet);

  if (cardset[aSize-1].name = cardname) then
  begin
    setLength(cardSet,aSize-1);
  end
  else
  begin
    index := -1;
    for i := 0 to aSize-1 do
      if (cardSet[i].name = cardname) then
        index := i;

    for i := index to aSize-2 do
      cardSet[i] := cardset[i+1];

    setLength(cardSet,aSize-1);
  end;
end;

procedure TForm1.SetToDesk(cardset: TCardArray);
var i:integer;
begin
    setLength(CDesk[DeskNextFree],length(cardSet));

    for i := 0 to Length(cardSet) do
      CDesk[DeskNextFree][i] := cardSet[i];

  inc(DeskNextFree);
end;
Und hier dann der Ausschnitt, wo der Aufruf stattfindet:

Delphi-Quellcode:
if (not checkset(tempCards))and(not checkrow(tempCards)) then
    Statusbar1.SimpleText:='Diese Karten können nicht ausgelegt werden.'

  else
  begin
    setToDesk(tempCards);

    for i := 0 to Length(tempCards)-1 do
      removeCard(Player1.cards,tempcards[i].name);

    updateGUI('Desk');
    updateGUI('Player1');
  end;
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat