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:
Aber das liefert sehr fragwürdige Zahlen.
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; Aufruf übrigens so:
Delphi-Quellcode:
Bei "lol" sagt er z.B. 5.
ShowMessage( IntToStr( Form1.GetLength(Form1.InputLabel.Text) ) );
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... |
Re: Funktion um Stringlänge zu ermitteln
So geht's:
Delphi-Quellcode:
PS: Dein Code ist schrecklich formatiert. ;)
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; |
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* |
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
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. |
Re: Funktion um Stringlänge zu ermitteln
Zitat:
Hab aber Luckies Funktion nochmal abgeändert, ohne len, nur mit Result. air |
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
Re: Funktion um Stringlänge zu ermitteln
Zitat:
Zitat:
Ich kann mir nur vorstellen, was du damit meinst, aber wenn ichs mir richtig vorstelle, macht es durchaus Sinn *schnell wieder zurückveränder* |
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:
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:
PChar(AString)
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; |
Re: Funktion um Stringlänge zu ermitteln
Jupp. Stimmt, aber auf die Schnelle ist mir nichts besseres eingefallen. ;)
|
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 |
Re: Funktion um Stringlänge zu ermitteln
Aber versucht mal, per Code auf MeinString[0] zuzugreifen.
Das mag der Compiler nicht ;) |
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
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; |
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:
Edit: Da war ein Adressoperator zu viel ;)
function MyLen(S: string): Integer;
begin Result := PDWORD(Integer(S)-4)^; end; |
Re: Funktion um Stringlänge zu ermitteln
das gibt aber falsche ergebnisse
|
Re: Funktion um Stringlänge zu ermitteln
Zitat:
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 |
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; |
Re: Funktion um Stringlänge zu ermitteln
Zitat:
|
Re: Funktion um Stringlänge zu ermitteln
Zitat:
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:
Eig. geht es nichtmal um die Länge eiens Strings, das war halt nur ein Beispiel
procedure GetLength(s: string): integer;
begin Result := length(s); end; 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