![]() |
Absturz in Delphi: Überlauf?
Hallo,
ich habe ein etwas komplizierteres Problem in Delphi, ich will mir zunächst mal ersparen, hier den ziemlich umfangreichen Quellcode reinzuposten und erkläre es so. Ich arbeite zur Zeit an einem Romme-Kartenspiel in Delphi, da gibt es unter anderemn 2 Methoden, die nacheinander aufgerufen werden: SetToDesk(), damit wird ein Set von Karten aus der Hand auf den Tisch gelegt. Danach wird in einer Schleife mit removeCard() jede der Set-Karten aus der Hand gelöscht. Nun zum Problem: Das Programm stürzt mit einer Schutzverletzung ab (Fehler beim Schreiben in Adresse.....). Das sieht so aus: Ich klicke auf den Button, das Programm hängt etwa 2-3 Sekunden, dann kommt der Fehler und zwar in dem Moment, wo er in die RemoveCard() springen will. Das Merkwürdige ist, dieser Fehler kommt nicht, wenn ich die SettoDesk() - Methode vorher nicht aufrufe, obwohl die beiden gar nichts miteinander zu tun haben, die schreiben nichtmal auf die gleichen Variablen, etc. Das einzige, was mir dazu einfällt, sind irgendwelche Heap-Überläufe, wobei an Daten ist da nicht wirklich viel...110 Spielkarten in 3-4 Arrays.... Ich arbeite in Delphi 7 und dies ist mein erstes Projekt, in dem ich mit dynamischen Arrays arbeite. Davon benutze ich einige, die auch meist per var-Parameter an Prozeduren übergeben werden. Bis auf eben diese Prozedur läuft das auch sehr gut. Oder was ist bei solchen Arrays noch zu beachten? |
Re: Absturz in Delphi: Überlauf?
Ich vermute, dass beim Durchlaufen des Arrays etwas falsch läuft. 2-3 Sekunden für 110 Elemente ist definitiv zu lang. Bist Du sicher, dass Du die Array-Grenzen einhältst?
|
Re: Absturz in Delphi: Überlauf?
Ohne den genauen Quellcode, werden wir da nicht viel tun können. Das einzigste was ich mir jetzt vorstellen könnte, wäre: wenn man SetLength() bei den dynamsichen arrays zu oft aufruft, dadurch entsteht viel overhead bzw einen überlauf. Man sollte sowenig wie möglich SetLength() aufrufen.
|
Re: Absturz in Delphi: Überlauf?
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:
Soweit die Typen, nun die 2 Methoden:
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;
Delphi-Quellcode:
Und hier dann der Ausschnitt, wo der Aufruf stattfindet:
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;
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz