AGB  ·  Datenschutz  ·  Impressum  







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

Abstrakter Fehler oO

Ein Thema von Green · begonnen am 17. Sep 2006 · letzter Beitrag vom 17. Sep 2006
Antwort Antwort
Seite 1 von 3  1 23      
Green

Registriert seit: 11. Jun 2006
156 Beiträge
 
#1

Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:18
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;
ShowMessage(GetId('ids.txt', 0)); Warum kommt da n Abstrakter Fehler und was zur Hölle is des???
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:20
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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:21
Das kommt weil TStrings abstrakt ist, ersetze
sl := TStrings.Create; mit sl := TStringList.Create;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:27
Mit der Freigabe und einem Try...finally-Block könnte es dann so aussehen:
Delphi-Quellcode:
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;
Übrigens: Die zusätzliche String-Variable kann man sich auch sparen, wenn man gleich result verwendet
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:31
Zitat von Martin K:
Übrigens: Die zusätzliche String-Variable kann man sich auch sparen, wenn man gleich result verwendet
Ich habe irgendwo einmal gelesen, dass man der Result-Variablen möglichst nur ein einziges Mal etwas zuweisen sollte und zwar am Ende der Funktion. In einer Schleife sollte man das nicht machen. Aber wieso, habe ich vergessen.

Ich würde also die ursprüngliche Möglichkeit bevorzugen.
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:32
Zitat von Martin K:
Mit der Freigabe und einem Try...finally-Block könnte es dann so aussehen:
Delphi-Quellcode:
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;
Übrigens: Die zusätzliche String-Variable kann man sich auch sparen, wenn man gleich result verwendet
Man kann sich ausserdem noch die Variable "j" sparen.
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 von Matze:
Zitat von Martin K:
Übrigens: Die zusätzliche String-Variable kann man sich auch sparen, wenn man gleich result verwendet
Ich habe irgendwo einmal gelesen, dass man der Result-Variablen möglichst nur ein einziges Mal etwas zuweisen sollte und zwar am Ende der Funktion. In einer Schleife sollte man das nicht machen. Aber wieso, habe ich vergessen.

Ich würde also die ursprüngliche Möglichkeit bevorzugen.
Hm, ich setze Result auch gerne mal am Anfang, für den Fall dass was schiefgeht auf einen eindeutigen Wert. Wenn Du wieder weißt wo das steht, würds mich intressieren, das auch zu lesen. Bzw. welchen Grund dieses hat.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:37
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:41
Zitat von Matze:
Ich habe irgendwo einmal gelesen, dass man der Result-Variablen möglichst nur ein einziges Mal etwas zuweisen sollte und zwar am Ende der Funktion. In einer Schleife sollte man das nicht machen. Aber wieso, habe ich vergessen.
Echt?
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 von GuenterS:
Man kann sich ausserdem noch die Variable "j" sparen.
Wenn wir jetzt noch die Parameter als Konstanten festlegen ist es Perfekt, außerdem kann man es wohl noch weiter vereinfachen:
Delphi-Quellcode:
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;
Was haltet ihr davon?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:42
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 von Martin K:
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.
Man kan auch anders sicherstellen, dass der Rückgabewert nicht undefiniert ist:
Delphi-Quellcode:
var
  s: String;
begin
  s := '';
  // mach was
  Result := s;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Abstrakter Fehler oO

  Alt 17. Sep 2006, 22:43
@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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 05:48 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