![]() |
Abstrakter Fehler oO
Delphi-Quellcode:
function GetId(f: string; i: integer): string;
var temp: string; j: integer; sl: TStrings; begin temp := ''; sl := TStrings.Create; sl.LoadFromFile(f); for j := 0 to 4 do begin temp := temp + sl[0][(i * 6) + j]; end; result := temp; end;
Delphi-Quellcode:
Warum kommt da n Abstrakter Fehler und was zur Hölle is des???
ShowMessage(GetId('ids.txt', 0));
|
Re: Abstrakter Fehler oO
Das kommt immer dann, wenn Du von akstrakte, also nicht implementierte Methoden aufrufst. In Deinem Beispiel passiert dies, weil Du eine Instance von TStrings erstellt, welche viele abstrakte Methoden besitzt. Besser wäre hier TStringList gewesen, was diesen Fehler beheben dürfte.
Die erzeugte StringList solltest Du aber auch wieder freigeben, am ende der Procedure, sonst erzeugst Du ein schones Memory leak. |
Re: Abstrakter Fehler oO
Das kommt weil TStrings abstrakt ist, ersetze
Delphi-Quellcode:
mit
sl := TStrings.Create;
Delphi-Quellcode:
sl := TStringList.Create;
|
Re: Abstrakter Fehler oO
Mit der Freigabe und einem Try...finally-Block könnte es dann so aussehen:
Delphi-Quellcode:
Übrigens: Die zusätzliche String-Variable kann man sich auch sparen, wenn man gleich result verwendet :wink:
function GetId(f: string; i: integer): string;
var j: integer; sl: TStrings; begin result := ''; sl := TStringList.Create; try sl.LoadFromFile(f); for j := 0 to 4 do result := result + sl[0][(i * 6) + j]; finally FreeAndNil(sl); end; end; |
Re: Abstrakter Fehler oO
Zitat:
Ich würde also die ursprüngliche Möglichkeit bevorzugen. |
Re: Abstrakter Fehler oO
Zitat:
Delphi-Quellcode:
function GetId(f: string; i: integer): string;
var sl: TStringList; begin sl := TStringList.Create; try sl.LoadFromFile(f); result := sl[0][(i*6)] + sl[0][(i*6)+1] + sl[0][(i*6)+2] + sl[0][(i*6)+3] + sl[0][(i*6)+4]; finally FreeAndNil(sl); end; end; Zitat:
|
Re: Abstrakter Fehler oO
Die result Varibale sollte man nur am Schluß setzen.
Ich galube in der heutigen Zeit sollte man die Lesbarkeit vor das Sparen von ein paar Bytes setzen. |
Re: Abstrakter Fehler oO
Zitat:
Das wäre mir neu. Aber Result am Anfang auf einen leeren String zu setzen und dann nachher auf die gewünschten Werte, macht Sinn - sonst könnte das Ergebnis bei einem Fehlschlag undefiniert sein. Zitat:
Delphi-Quellcode:
Was haltet ihr davon?
function GetId(const f: string; const i: integer): string;
var sl: TStrings; begin result := ''; sl := TStringList.Create; try sl.LoadFromFile(f); result := Copy(sl[0], i*6, 5); finally FreeAndNil(sl); end; end; |
Re: Abstrakter Fehler oO
Delphi legt das Funktionsergebnis in dem Register EAX ab. Wenn ich nun der interne Result Variable etwas zuweise am Anfang wrd das un EAX abgelegt. Optimiert der Compiler nun den Code, hat er ein Register weniger, dass er benutzen kann bzw. erst wieder frei machen muss und zum Schluss wieder belegt. Weise ich Result am Schluss zu, hat der Compiler das EAX Register noch für Optimierungen frei.
Zitat:
Delphi-Quellcode:
var
s: String; begin s := ''; // mach was Result := s; end; |
Re: Abstrakter Fehler oO
@mkinzler:
Hast auch wieder recht, irgendwie würds mich aber schon intressieren was so in der Datei stehen mag, dass man sie komplett einlesen muss, um schlussendlich nur die erste Zeile zu verwenden. Desweiteren fehlt da noch jede Prüfung ob diese erste Zeile überhaupt lang genug ist. @luckie: Danke für die Information, wieder was gelernt. |
Re: Abstrakter Fehler oO
Das Initialisieren von Result ist nicht nötig. Ich würde das
Delphi-Quellcode:
besser ins finally verschieben.
result := '';
|
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Ihr meint wohl sowas:
Delphi-Quellcode:
function GetId(const f: string; const i: integer): string;
var temp: String; sl: TStrings; begin temp := ''; try sl := TStringList.Create; try sl.LoadFromFile(f); temp := Copy(sl[0], i*6, 5); finally FreeAndNil(sl); end; finally result := temp; end; end; |
Re: Abstrakter Fehler oO
[edit]Ja, müßte es treffen[/edit]
[edit2]das ist mir auch eingefallen, aber konnte meinen Beitrag nicht komplett entfernen :oops: [/edit2] |
Re: Abstrakter Fehler oO
[edit]Herrje, diese ganzen Edits...[/edit]
|
Re: Abstrakter Fehler oO
das man "result" erst am ende bzw. vor verlassen der Funktion zuweist kommt wohl von anderen Programmiersprachen wie C, C++, PHP etc. wo durch das zuweisen des Rückgabewertes die Funktion gleichzeitig verlassen wird.
|
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Delphi-Quellcode:
So sollte es gehen.
function GetId(const f: string; const i: integer): string;
var temp: String; sl: TStrings; begin temp := ''; sl := TStringList.Create; try sl.LoadFromFile(f); temp := Copy(sl[0], i*6, 5); finally result := temp; FreeAndNil(sl); end; end; |
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Zitat:
Aber ja, man könnte den Code von mir aus auch so machen, wie Luckie geschrieben hat. |
Re: Abstrakter Fehler oO
Zitat:
Delphi-Quellcode:
die variante mit finally kommt ja dieser gleich:
function GetId(const f: string; const i: integer): string;
var temp: String; sl: TStrings; begin sl := TStringList.Create; try sl.LoadFromFile(f); temp := Copy(sl[0], i*6, 5); except temp := ''; end; FreeAndNil(sl); result := temp; end;
Delphi-Quellcode:
function GetId(const f: string; const i: integer): string;
var temp: String; sl: TStrings; begin temp := ''; sl := TStringList.Create; try sl.LoadFromFile(f); temp := Copy(sl[0], i*6, 5); except end; result := temp; FreeAndNil(sl); end; |
Re: Abstrakter Fehler oO
Zitat:
|
Re: Abstrakter Fehler oO
Zitat:
Delphi-Quellcode:
procedure Test;
var i: integer; lList: TList; begin i := 0; lList.Add(@i); // <-- Verhängnisvolle Zeile try ShowMessage('TEST'); finally ShowMessage('FINALLY'); end; end; Habe das gerade eben mal schnell mit TurboDelphi probiert, er kommt nicht zum ShowMessage('FINALLY'); Würde ich die verhängnissvolle Zeile innerhalb des Try Blockes machen schon. |
Re: Abstrakter Fehler oO
Ach so meinst du das. Stimmt, das hatte ich gar nicht bedacht. Aber in jedem Mustercode wird es ohne doppeltes "try" gelöst. Also kann da eigentlich auch nichts passieren.
|
Re: Abstrakter Fehler oO
Natürlich kommt er nur in's finally wenn es vor dem try nicht schon gekracht hat.
D.h. wenn in unserem obigen Beispiel das Erzeugen der StringList fehlschlägt (was eigentlich nicht vorkommen sollte), wird der finally-Teil auch nicht ausgeführt. Zitat:
Delphi-Quellcode:
sl := TStringList.Create;
try //do something if sl[0] = 'lad mir ne neue StringList' then begin sl2 := TStringList.Create; try // do something finally FreeAndNil(sl2); end; end; finally FreeAndNil(sl); end; |
Re: Abstrakter Fehler oO
In dem Fall sollte man das auch, das ist korrekt. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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