Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inttostr & strtoint selber schreiben. (https://www.delphipraxis.net/70582-inttostr-strtoint-selber-schreiben.html)

Evian 1. Jun 2006 11:07


inttostr & strtoint selber schreiben.
 
Hallöchen,

ich sitze hier gerade im Unterricht und wir haben die Aufgabe bekommen 2 Funktionen zum umwandeln von Integerwerten in Stringwerte und umgekehrt zu schreiben. Dabei sollen wir auf die Standardfunktionen inttostr und strtoint möglichst verzichten. Gut, der Anspruch ist hier nicht besonders hoch und der Lehrer wird warscheinlich wieder von jeder Lösung begeistert sein, aber ich habe mir mal kurz was zusammen gekritzelt:

String in Integer umwandeln:
Delphi-Quellcode:
function s2i(str: String):Integer;
VAR
i,x : INTEGER;
BEGIN
  result := 0;
  x := 1;
  for i := length(str) downto 1 DO
  BEGIN
    result := result + ((ord(str[i])- 48)*x);
    x := x * 10;
  END;
END;
Integer in String umwandeln
Delphi-Quellcode:
function i2s(int: Integer):String;
BEGIN
  result := '';
  while (int <> 0)DO
  BEGIN
    result := chr((int mod 10)+48)+result;
    int := int DIV 10;
  END;
END;
Ich hab dar zwar keine Fehlerbehandlung drinne, aber es funktioniert soweit. Trotzdem gehe ich aber davon aus, dass der Code nicht besonders effizient ist... hat wer von euch noch eine andere Idee?!

gruß

Evi

EDIT: Entsprechend des Vorschlags von Pacman1986 angepasst.

JasonDX 1. Jun 2006 11:12

Re: inttostr & strtoint selber schreiben.
 
Also: Fuer StrToInt gibts das schoene Delphi-Referenz durchsuchenval, auf das StrToInt am End auch zurueckgreift.
Und fuer IntToStr kannst du ja Delphi-Referenz durchsuchenFormat verwenden *g*

greetz
Mike

pacman1986 1. Jun 2006 11:12

Re: inttostr & strtoint selber schreiben.
 
mein Vorschlag wäre du brauchst erg nicht ^^

sakura 1. Jun 2006 11:17

Re: inttostr & strtoint selber schreiben.
 
Zitat:

Zitat von pacman1986
mein Vorschlag wäre du brauchst erg nicht ^^

Gerade das ist sauber, da man so das AX-Register für andere Aufgaben freihält. Das Ergebnis der Funktion wird über EAX zurückgegeben. In dem Moment, in welchem Du Result nutzt, ist es blockiert.

...:cat:...

P.S.1: In reinem Pascal (ohne ASM) wirst Du StrToInt auch nicht entscheidend effektiver gestalten können.
P.S.2: Was ist mit negativen Zahlen?

Evian 1. Jun 2006 11:19

Re: inttostr & strtoint selber schreiben.
 
Zitat:

Zitat von JasonDX
Also: Fuer StrToInt gibts das schoene Delphi-Referenz durchsuchenval, auf das StrToInt am End auch zurueckgreift.
Und fuer IntToStr kannst du ja Delphi-Referenz durchsuchenFormat verwenden *g*

greetz
Mike

Stimmt val kenn ich ja noch aus den alten Turbo Pascal Zeiten... :)
Format werd ich mir mal genauer anschauen, danke für den Tip!

Zitat:

Zitat von Pacman1986
mein Vorschlag wäre du brauchst erg nicht ^^

´Ja Du hast Recht, ich könnte auch gleich mit Result arbeiten, wenn ich es entsprechend initialisiere.

Flocke 1. Jun 2006 11:24

Re: inttostr & strtoint selber schreiben.
 
Zitat:

Zitat von sakura
Gerade das ist sauber, da man so das AX-Register für andere Aufgaben freihält. Das Ergebnis der Funktion wird über EAX zurückgegeben. In dem Moment, in welchem Du Result nutzt, ist es blockiert.

Das will ich nicht hoffen! Der Compiler kann Result so lange wie eine normale lokale Variable behandel bis die Funktion/Prozedur verlassen wird. Ich kann's gerade nicht überprüfen, aber schließlich kann man ja auch Funktionen aufrufen nachdem man etwas an Result zugewiesen hat - und dabei würde der Inhalt von EAX zerstört werden (und ich habe noch keinen disassemblierten Delphi-Code gesehen, bei dem immer ein push eax/pop eax um Funktionsaufrufe herum steht).

Evian 1. Jun 2006 11:29

Re: inttostr & strtoint selber schreiben.
 
Zitat:

Zitat von sakura
P.S.2: Was ist mit negativen Zahlen?

...ups!!!

Edit: ok hier mit vorzeichen:

Delphi-Quellcode:
function s2i(str: String):Integer;
VAR
i,x : INTEGER;
BEGIN
  result := 0;
  x := 1;
  for i := length(str) downto 1 DO
  BEGIN
    if str[i] = '-' then
    result := result * -1 else
    BEGIN
      result := result + ((ord(str[i])- 48)*x);
      x := x * 10;
    END;
  END;
END;

function i2s(int: Integer):String;
VAR
vorz : char;
BEGIN
  result := '';
  vorz := chr(32);
  if int < 0 THEN
  BEGIN
    int := int * -1;
    vorz := '-';
  END;
  while (int <> 0)DO
  BEGIN
    result := chr((int mod 10)+48)+result;
    int := int DIV 10;
  END;
  result := vorz + result;
END;

jbg 1. Jun 2006 11:51

Re: inttostr & strtoint selber schreiben.
 
Zitat:

Zitat von Flocke
und ich habe noch keinen disassemblierten Delphi-Code gesehen, bei dem immer ein push eax/pop eax um Funktionsaufrufe herum steht

Und wenn man eine lokale String Variable hat oder einen String-Parameter ohne var/const/out, dann wird für Result sowieso auf den Stack Platz geschafft, weil der Compiler ein try/finally um die Funktion aufbaut. Da kann die Zuweisung an Result auch direkt vor dem "end" stehen. Das finally kommt trotzdem danach.

pszopp 1. Jun 2006 12:20

Re: inttostr & strtoint selber schreiben.
 
Hi,

was passiert wenn s2i mit z.B. 34-Ag-3 aufgerufen wird?

Eine minimale Optimierung erreichst du, wenn du str als Const übergibst:
Delphi-Quellcode:
function s2i(CONST str: String):Integer;

Viele Grüße,
pszopp

Amateurprofi 1. Jun 2006 23:29

Re: inttostr & strtoint selber schreiben.
 
hallo evian

wie wäre diese version von s2i

Delphi-Quellcode:
FUNCTION S2I(const s:string):integer;
var i:integer; neg:boolean;
begin
   result:=0;
   if Length(s)=0 then exit;
   neg:=s[1]='-';
   for i:=Integer(neg)+1 to Length(s) do result:=result*10+Ord(s[i])-48;
   if neg then result:=-result;
end;
setzt voraus, das s ein korrekter dezimalstring ist.


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