Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion um Stringlänge zu ermitteln (https://www.delphipraxis.net/43696-funktion-um-stringlaenge-zu-ermitteln.html)

Airblader 7. Apr 2005 11:38


Funktion um Stringlänge zu ermitteln
 
Hi :)
Natürlich kenne ich length...

aber ein Freund von mir weiss nicht, wie man eigene Funktionen macht und wollte deshalb eine
length()-"imitation" schreiben.
Ich hab ihm meinen Ansatz genannt und er fragte, ob ich den mal machen könnte.
Hab ich:

Delphi-Quellcode:
function TForm1.GetLength(s: string): integer;
var
        i,
        count: integer;
begin
        i := 1;
        count := 0;

        while(TRUE) do
        begin
                try
                        if s[i] <> '' then INC(count);
                        Inc(i);
                except
                        break;
                end;
        end;

        Result := count;
end;
Aber das liefert sehr fragwürdige Zahlen.
Aufruf übrigens so:
Delphi-Quellcode:
ShowMessage( IntToStr( Form1.GetLength(Form1.InputLabel.Text) ) );
Bei "lol" sagt er z.B. 5.
Bei "lolo" geht er schon auf über 1800 :shock:

Weiss jemand woran das liegen kann?

Oder ist die Idee an sich schon falsch?

air
P.S.: Hab anstatt while(TRUE) auch mit nem Boolean probiert, ging auch nicht...

Luckie 7. Apr 2005 11:43

Re: Funktion um Stringlänge zu ermitteln
 
So geht's:
Delphi-Quellcode:
function mylength(s: String): Integer;
var
  len: Integer;
begin
  len := 1;
  while s[len] <> #0 do
    inc(len);
  result := len-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(mylength('Michael Puff')));
end;
PS: Dein Code ist schrecklich formatiert. ;)

Airblader 7. Apr 2005 11:47

Re: Funktion um Stringlänge zu ermitteln
 
Argh..natürlich :mrgreen:

Aber trotzdem die Frage, wie bei meinem (doofen) Ansatz so seltsame Werte auftreten :?:

Die Idee war die:
Sobald der String mit s[i] ne AV auslösen würde, fang ich das per except ab und brech die schleife ab.
Selbst wenn #0 mitgewertet wird, müsste es doch gehen, nur, dass ich count-1 machen müsste, oder?

air
edit: wieso schrecklich formatiert? Ich machs immer mit TabStop und find mich so gut zurecht ;) Leerzeilen mach ich
sowieso immer wie nochmal was *g*

Basilikum 7. Apr 2005 11:51

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Luckie
PS: Dein Code ist schrecklich formatiert. ;)

und noch viel schrecklicher vom Inhalt her.... so lange probieren, bis eine Access-Violation auftritt.... ;-)

Jasocul 7. Apr 2005 11:52

Re: Funktion um Stringlänge zu ermitteln
 
Du kannst durchaus auf Speicher außerhalb des Strings zugreifen. Es muss nicht zwingend sofort eine Exception kommen. Erst wenn du irgendwohin gerätst was benutzt wird, bekommst du deinen Abbruch.

btw: Die Länge eines PascalStrings steht an Stelle 0 des Strings. s[0] gibt dir also auch die Länge zurück.

Airblader 7. Apr 2005 11:55

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Basilikum
Zitat:

Zitat von Luckie
PS: Dein Code ist schrecklich formatiert. ;)

und noch viel schrecklicher vom Inhalt her.... so lange probieren, bis eine Access-Violation auftritt.... ;-)

Schrecklich aber theoretisch funktionabel :warn: :mrgreen: (ich sagte theoretisch! :mrgreen: )

Hab aber Luckies Funktion nochmal abgeändert, ohne len, nur mit Result.

air

Luckie 7. Apr 2005 11:55

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Jasocul
btw: Die Länge eines PascalStrings steht an Stelle 0 des Strings. s[0] gibt dir also auch die Länge zurück.

Jupp, aber das war ja nur ein beispiel, um seinen Freund etwas zu verdeutlichen.

Luckie 7. Apr 2005 11:56

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Airblader
Hab aber Luckies Funktion nochmal abgeändert, ohne len, nur mit Result.

Warum verhunst du meinen Code? Das war Absicht. So kann der Compiler besser optimieren, da er das EAX Register frei hat.

Jasocul 7. Apr 2005 11:59

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Jasocul
btw: Die Länge eines PascalStrings steht an Stelle 0 des Strings. s[0] gibt dir also auch die Länge zurück.

Jupp, aber das war ja nur ein beispiel, um seinen Freund etwas zu verdeutlichen.

Stimmt. Wer lesen kann (und sich das auch noch merkt) ist im Vorteil.

Airblader 7. Apr 2005 12:00

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Luckie
Warum verhunst du meinen Code?

Dumme Angewohnheit von mir :angel2: ;)

Zitat:

Zitat von Luckie
So kann der Compiler besser optimieren, da er das EAX Register frei hat.

Aja...was? :mrgreen:
Ich kann mir nur vorstellen, was du damit meinst, aber wenn ichs mir richtig vorstelle, macht es durchaus Sinn
*schnell wieder zurückveränder*

choose 7. Apr 2005 12:11

Re: Funktion um Stringlänge zu ermitteln
 
Hallo Luckie,

per definition ist ein Delphi-String nicht durch ein null-Zeichen begrenzt sondern durch die Längenbeschreibung am Anfang des Datenbereichts. Mir ist bewusst, dass er Gründen der vereinfachten Kompatibilität mit einem null-Zeichen endet, um Ausdrücke der Art
Delphi-Quellcode:
PChar(AString)
ohne eine erneute Kopie zu realisieren, aber Deine Implementierung von mylength ist kein Ersatz für Length, weil es Fälle gibt, in denen die Rückgabewerte voneinander abweichen können:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  AString = 'a delphi string can contain '#0' several '#0' null characters';
begin
  Assert( Length(AString) = mylength(AString) );
end;

Luckie 7. Apr 2005 12:21

Re: Funktion um Stringlänge zu ermitteln
 
Jupp. Stimmt, aber auf die Schnelle ist mir nichts besseres eingefallen. ;)

Airblader 7. Apr 2005 12:36

Re: Funktion um Stringlänge zu ermitteln
 
Ich erwähne, dass es auch nicht um die Funktion direkt geht, es ging eig. nur darum, um ihm zu zeigen,
wie das mit eigenen Funktionen, Parametern und Rückgabewerten geht ;)
Die eigentliche Idee war ja auf der meines Freundes basiert, ich hatte sie zuerst nur so umgesetzt

air

Ultimator 7. Apr 2005 14:35

Re: Funktion um Stringlänge zu ermitteln
 
Aber versucht mal, per Code auf MeinString[0] zuzugreifen.
Das mag der Compiler nicht ;)

Jasocul 7. Apr 2005 14:46

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Ultimator
Aber versucht mal, per Code auf MeinString[0] zuzugreifen.
Das mag der Compiler nicht ;)

Stimmt. Habe ich aber auch schon ein paar Jahre nicht mehr so gemacht. :oops:

Pseudemys Nelsoni 7. Apr 2005 14:56

Re: Funktion um Stringlänge zu ermitteln
 
mit nem statischen string geht das aber, siehe:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string[255];
begin
  s := 'blah';
  Showmessage(IntToStr(Byte(s[0])));
end;

Dax 7. Apr 2005 15:02

Re: Funktion um Stringlänge zu ermitteln
 
Ein "normaler" Pascal-String hat am Anfang soweit ich weiß ein DWORD als Längenbeschreibung, wieso nicht das auslesen?

Delphi-Quellcode:
function MyLen(S: string): Integer;
begin
  Result := PDWORD(Integer(S)-4)^;
end;
Edit: Da war ein Adressoperator zu viel ;)

Pseudemys Nelsoni 7. Apr 2005 15:05

Re: Funktion um Stringlänge zu ermitteln
 
das gibt aber falsche ergebnisse

Airblader 7. Apr 2005 15:07

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von Dax
Ein "normaler" Pascal-String hat am Anfang soweit ich weiß ein DWORD als Längenbeschreibung, wieso nicht das auslesen?

Delphi-Quellcode:
function MyLen(S: string): Integer;
begin
  Result := PDWORD(Integer(@S)-4)^;
end;

Das müsste man nun aber als OT beschreiben. :mrgreen:
Mein Kumpel weiss nichtmal wie man eigene Funktionen deklariert, dann wird er ja schreien bei dem Einzeiler
(da bin ich übrigens auch kurz davor *gg*)

air

mael 7. Apr 2005 15:09

Re: Funktion um Stringlänge zu ermitteln
 
AnsiStrings benutzen ja jetzt 4 Bytes = 1 Integer um die Länge zu speichern, deswegen geht s[0] nicht.

So ähnlich geht es aber immer noch:

Delphi-Quellcode:
function Len(const s: string): Integer;
begin
  if Pointer(s) = nil then
    Result := 0
  else
    Result := PInteger(Cardinal(s) - 4)^;
end;

himitsu 7. Apr 2005 15:20

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von mael
AnsiStrings benutzen ja jetzt 4 Bytes = 1 Integer um die Länge zu speichern, deswegen geht s[0] nicht.

dann könnte er ja auch gleich Length verwenden, aber das geht bei ihm halt nicht.

Airblader 8. Apr 2005 06:32

Re: Funktion um Stringlänge zu ermitteln
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von mael
AnsiStrings benutzen ja jetzt 4 Bytes = 1 Integer um die Länge zu speichern, deswegen geht s[0] nicht.

dann könnte er ja auch gleich Length verwenden, aber das geht bei ihm halt nicht.

Dochdoch, es ist schon Okay.
Es geht nicht um den Inhalt der Funktion, sondern rein um die Funktionsdeklaration, mich hat es selbst nur erst etwas gewundert, was an meinem falsch war.
Theoretisch könnte man hier auch sagen:

Delphi-Quellcode:
procedure GetLength(s: string): integer;
begin
   Result := length(s);
end;
Eig. geht es nichtmal um die Länge eiens Strings, das war halt nur ein Beispiel

air


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