Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Runtime Error bei meiner Funktion (https://www.delphipraxis.net/41566-runtime-error-bei-meiner-funktion.html)

Neutral General 5. Mär 2005 10:47


Runtime Error bei meiner Funktion
 
Wenn ich diese Funktion in meinem Programm aufrufe kommt ein Runtime Error wenn ich das Programm beende.

Delphi-Quellcode:
var Datei : Array of TDatei;
Delphi-Quellcode:
function Anzahl : Integer;
var loc : TStringlist;
    i : Integer;
begin
  loc := TStringlist.Create;
  loc.LoadFromFile('dc.loc');
  SetLength(Datei,Loc.Count);
  for i := 1 to Loc.Count do begin
   Datei[i] := TDatei.Create;
  end;
  Result := loc.Count;
  loc.Free;
end;
Das Problem liegt nachweislich bei der Erzeugung der TDatei's.
Aber ich seh dadrin kein Problem :gruebel:

Die Muhkuh 5. Mär 2005 10:49

Re: Runtime Error bei meiner Funktion
 
Vielleicht solltest du die TDateien die du erstellt auch wieder free'en? ;)

Ultimator 5. Mär 2005 10:51

Re: Runtime Error bei meiner Funktion
 
[Falsch] [Doch Richtig]
Delphi-Quellcode:
for i := 1 to Loc.Count do begin
   Datei[i] := TDatei.Create;
Probiers mal so
Delphi-Quellcode:
for i := 0 to Loc.Count-1 do begin
   Datei[i] := TDatei.Create;
Da das erste Element den Index 0 hat, hat das letzte nicht den Index Lerngth, sondern Length-1 ;-)
[/Falsch] [/Doch Richtig]


Shit, hHast nicht Recht ;-)

Neutral General 5. Mär 2005 10:53

Re: Runtime Error bei meiner Funktion
 
@ Ultimator : Ohh nein nicht schon wieder.
Ich les die Strings ja nicht ein -.-
Ich will doch nur so viele TDatei's erstellen wie die Datei Zeilen hat.
Das wurde aber schon hier geklärt ;)

@ Spider : Dadran dürfte es aber normalerweise nicht liegen...
Außerdem wenn ich ins OnClose das schreibe :

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i : Integer;
begin
  for i := 1 to Length(Datei) do
  Datei[i].Free;
end;
bekomm ich ne Fehlermeldung "Ungültige Zeigeroperation" beim Beenden. :?

Bernhard Geyer 5. Mär 2005 10:56

Re: Runtime Error bei meiner Funktion
 
Ultimator hat schon recht, jedoch nicht nur bezüglich der Stringlist sondern auch deinem dynamischen Array.

Dieses hat eine Array-Gültigkeit von 0 bis Loc.Count-1.

Die Muhkuh 5. Mär 2005 10:56

Re: Runtime Error bei meiner Funktion
 
hi,

es muss:

Delphi-Quellcode:
for I := 0 to High(Datei) do
  Datei[I].Free;
heißen

[edit]
@Bernhard
das hatten wir hier schonmal: http://www.delphipraxis.net/internal...&highlight=for

Neutral General 5. Mär 2005 10:57

Re: Runtime Error bei meiner Funktion
 
Ok dann beomm ich zwar nichtmehr den Zeigeroperationfehler aber der Runtimefehler bleibt :roll:

[Edit]
Ok bei 0 to Loc.Count-1 gehts...
Ist ja von der Anzahl das gleich wie 1 to Loc.Count. Bernhard hat doch Recht. Aber stimmt ja, ein dynamisches Array beginnt mit 0. :roll: [/edit]

alcaeus 5. Mär 2005 11:01

Re: Runtime Error bei meiner Funktion
 
Delphi-Quellcode:
function Anzahl : Integer;
var loc : TStringlist;
    i : Integer;
begin
  loc := TStringlist.Create;
  loc.LoadFromFile('dc.loc');
  SetLength(Datei,Loc.Count);
  for i := 0 to Loc.Count-1 do begin //Loc geht von 0 bis Loc.Count-1
   Datei[i] := TDatei.Create;
  end;
  Result := loc.Count;
  loc.Free;
end;
So muesste das funktionieren...tuts jedenfalls bei mir.
Warum wollen alle ihre dynamischen Arrays von 1..Count ansprechen? :roll:

Greetz
alcaeus

Bernhard Geyer 5. Mär 2005 11:09

Re: Runtime Error bei meiner Funktion
 
Zitat:

Zitat von alcaeus
Warum wollen alle ihre dynamischen Arrays von 1..Count ansprechen? :roll:

Weil man im Mathematikunterricht erst die natürlichen Zahlen ohne Null gelernt bekommt (1..10).
Auch weil Delphi ein Mischmasch zwischen 0 und 1-Basierenden Elementen hat (String -> 1-Basierend, dynamisches Array -> 0-Basierend, ...)

alcaeus 5. Mär 2005 11:11

Re: Runtime Error bei meiner Funktion
 
Zitat:

Zitat von Bernhard Geyer
Auch weil Delphi ein Mischmasch zwischen 0 und 1-Basierenden Elementen hat (String -> 1-Basierend, dynamisches Array -> 0-Basierend, ...)

Ist zwar OT, aber nein. Strings (jedenfalls ShortStrings mit bis zu 255 Zeichen) sind auch 0-basiert. Auf das 0te Element kannst du nur nicht zugreifen, das ist das Laengenbyte. Die neuen Strings mit Kapazitaeten von bis zu 2GB arbeiten etwas komplizierter, aber ShortStrings sind definitiv 0-basiert.

Greetz
alcaeus

Bernhard Geyer 5. Mär 2005 11:23

Re: Runtime Error bei meiner Funktion
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Bernhard Geyer
Auch weil Delphi ein Mischmasch zwischen 0 und 1-Basierenden Elementen hat (String -> 1-Basierend, dynamisches Array -> 0-Basierend, ...)

Ist zwar OT, aber nein. Strings (jedenfalls ShortStrings mit bis zu 255 Zeichen) sind auch 0-basiert. Auf das 0te Element kannst du nur nicht zugreifen, das ist das Laengenbyte. Die neuen Strings mit Kapazitaeten von bis zu 2GB arbeiten etwas komplizierter, aber ShortStrings sind definitiv 0-basiert.

Greetz
alcaeus

Bin nicht deiner Meinung. Das erste Element in einem String wird mit [1] angesprochen. Das das 0te Element in einem ShortString die Längenangabe ist, ist für den normalen Entwickler irrelevant, da man die Länge mit Length(MeinString) abprüfen sollte. Und das bei einem "normalen" String noch vor dem ersten Zeichen 8 Byte für Längen und Referenzzähler verbraten werden kann man zwar wissen, ist aber nur relevant wenn man C-Syntaxbasierte (PChar/PWideChar) Funktionen (Win-API, ...) verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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-2025 by Thomas Breitkreuz