AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Absturz in Delphi: Überlauf?

Ein Thema von hackyie · begonnen am 21. Feb 2005 · letzter Beitrag vom 21. Feb 2005
Antwort Antwort
hackyie

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

Absturz in Delphi: Überlauf?

  Alt 21. Feb 2005, 09:23
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?
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Absturz in Delphi: Überlauf?

  Alt 21. Feb 2005, 09:31
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?
Peter
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Absturz in Delphi: Überlauf?

  Alt 21. Feb 2005, 09:32
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.
  Mit Zitat antworten Zitat
hackyie

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

Re: Absturz in Delphi: Überlauf?

  Alt 21. Feb 2005, 10: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz