Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AV in <TStringlist>.Count?! (https://www.delphipraxis.net/119759-av-tstringlist-count.html)

zahor 31. Aug 2008 00:08


AV in <TStringlist>.Count?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin DP,
wie ihr vllt. wisst arbeite ich im Moment an Snakey Fusion - da führen xZise, mr_emre_d und ich die snakes von emre und xZise / mir zusammen.
nun bin ich auf ein äußerst merkwürdiges problem gestoßen: ich hab eine funktion geschrieben, die das spielfeld aus einem logfile ausliest.
ich habe jetzt eine TStringlist und ein array of array of byte (naja eig. TStatus, aber was ändert das schon). nun will ich FMap (das ist das array) eine Größe zuweisen.
dazu brauche ich mapp.count (mapp ist die stringlist) - aber das gibt mir ne AV! why? ich hab keine ahnung, und xZise hat den fehler auch nicht gefunden (vllt liegts auch an der uhrzeit?).
hier die komplette funktion:
Delphi-Quellcode:
procedure TArena.LoadFromLog(const AFileName: string);
var i,j:integer;
    myLog: tlogreader;
    mapp: tstringlist;
begin
  mapp := TStringlist.Create;
  myLog := TLogReader.Create(AFileName);
  myLog.Search('Arena');
  myLog.ReadSearchedObject(mapp,0);
  FHeight := mapp.Count;
  FWidth := length(mapp[2]);
  SetLength(FMap,FHeight,FWidth);
  for i := 2 to mapp.count - 1 do
  begin
    for j := 1 to length(mapp[i]) do
    begin
      if mapp[i][j] = '/' then
        FMap[i,j] := stClear
      else if mapp[i][j] = '§' then
        FMap[i,j] := stWall
      else
        showmessage('Error: Undefined character: '+mapp[i][j]);
    end;
  end;
  mapp.Free;
  myLog.Free;
end;
das komplette projekt findet ihr im anhang.

edit: TLogReader ist in uLog definiert; die ReadFromLog Stelle ist aus uArena
das mit TLogReader.Search sucht einen bestimmtem Abschnitt im Log, ist etwa so wie bei ner ini. readsearchedobject liest dann das gefundene und gibt es aus.
aber ich geh jetzt schlafen...

grenzgaenger 31. Aug 2008 00:11

Re: AV in <TStringlist>.Count?!
 
kann es sein, dass .count < 0 ist?

zahor 31. Aug 2008 00:12

Re: AV in <TStringlist>.Count?!
 
thx für die schnelle antwort! aber ich weiß es nicht - ich krieg da ja ne AV in der count funktion

omata 31. Aug 2008 00:23

Re: AV in <TStringlist>.Count?!
 
Das Problem ist nicht mapp.Count! Es ist FHeight!

Und wieso das? Weil FArena im Hauptmodul nicht erzeugt wurde!

Und das könnt ihr wieder mal nicht sehen, weil ihr die Bereichsprüfung nicht aktiviert habt!

Was mir noch aufgefallen ist...
Delphi-Quellcode:
procedure TLogReader.Search(const AName: string);
var
  i, strLen: Integer;
  cnt : Integer;
begin
  if FLog.Count > 2 then begin // <-- Einbauen!
    SetLength(FSearchPositions, FLog.Count - 2); // <-- böse, wenn FLog.Count = 0
und...
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Self.DoubleBuffered:=true;
Dann flackert die Anzege auch nicht mehr.

FArena wird in der Hauptform nur erzeugt, wenn ein Spiel gestartet wird. Es wird aber niemals freigeben!

grenzgaenger 31. Aug 2008 00:23

Re: AV in <TStringlist>.Count?!
 
wo kommt denn die fehlermeldung?

btw: solltet ihr euch angewöhnen, ressourcenschutzblöcke einzurichten und euere klassen auch wieder freizugeben...

xZise 31. Aug 2008 09:38

Re: AV in <TStringlist>.Count?!
 
Zitat:

Zitat von omata
Und wieso das? Weil FArena im Hauptmodul nicht erzeugt wurde!

Daran wirds wohl liegen. Aber das er dennoch rein springt irritiert etwas. Aber danach funktioniert es einwandfrei.

Zitat:

Zitat von omata
Und das könnt ihr wieder mal nicht sehen, weil ihr die Bereichsprüfung nicht aktiviert habt!

Nanana... Ich habe diese Option aktiviert! Und man beachte, dass sie in Zeile 20 hochgegangen ist!

MfG
xZise

zahor 31. Aug 2008 10:02

Re: AV in <TStringlist>.Count?!
 
danke oamata!
aber das
Delphi-Quellcode:
{$R+}
in uMain schaltet meines Wissens nach die Bereichsprüfung ein...

Roachford 31. Aug 2008 11:27

Re: AV in <TStringlist>.Count?!
 
Zitat:

Zitat von zahor
aber das
Delphi-Quellcode:
{$R+}
in uMain schaltet meines Wissens nach die Bereichsprüfung ein...

Aber nur für die Unit ab der Position. Es ist immer empfehlenswert global die Berichsprüfung während der Entwicklung eines Projektes in den Projektoptionen zu aktivieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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