![]() |
Kann Delphi jetzt kein s[1] mehr?
Geht nicht :-(
Die Funktion soll die Leerzeichen am Anfang eines Strings zählen. Warum geht das so nicht? Ist Delphi jetzt doof? Oder ich? Sonst ging das doch immer so??
Delphi-Quellcode:
function countspacesinfront(s:string):integer;
var z:integer; sx:string; begin sx:=s; z:=0; while sx[1]=' ' do begin sx:=copy(sx,2,length(sx)-1); inc(z); end; countspacesinfront:=z; end; |
Re: Kann Delphi jetzt kein s[1] mehr?
hi,
was geht da nicht? Muesste das nicht
Delphi-Quellcode:
anstatt
result := z;
Delphi-Quellcode:
heißen?
countspacesinfront:=z;
Mfg ReDoX |
Re: Kann Delphi jetzt kein s[1] mehr?
Bei mir funktionierts :gruebel: (Delphi 7 Personal)
@Redox: Kann man beides machen. |
Re: Kann Delphi jetzt kein s[1] mehr?
Geht bei mir ohne Probleme, was klappt denn nicht?
|
Re: Kann Delphi jetzt kein s[1] mehr?
Könntest du bitte "Geht nicht" etwas präzisieren...
|
Re: Kann Delphi jetzt kein s[1] mehr?
Geht nicht soll heißen, dass das Teil bei mir immer 0 ausspuckt.
Wenn ich jetzt mit
Delphi-Quellcode:
dat Ergebnis ausgeben lasse bekomm ich ne Access Violation...
showmessage(inttostr(countspacesinfront(einstring)));
|
Re: Kann Delphi jetzt kein s[1] mehr?
Liste der Anhänge anzeigen (Anzahl: 2)
Die ganze Funktion lautet so
Delphi-Quellcode:
is a bisserl blöd weil das aus nem Projekt stammt.
procedure THauptfenster.fuelleListe(liste:tstrings; identifier,name:string);
var temp:string; position,i:integer; function countspacesinfront(s:string):integer; var z:integer; sx:string; begin sx:=s; z:=0; while sx[1]=' ' do begin sx:=copy(sx,2,length(sx)-1); inc(z); end; countspacesinfront:=z; end; begin liste.Clear; for i:=0 to scintilla1.Lines.Count-1 do begin temp:=Scintilla1.lines[i]; temp:=cutby(temp); if lowercase(copy(temp,1,length(identifier)))<>lowercase(identifier) then continue; position:=scintilla1.positionfromline(i)+countspacesinfront(temp); if getattribut(position)=11 then liste.add(cutby(temp)) else liste.add(cutby(temp)+' ('+inttostr(position)+')'); end; end; Kurz zu den verwendeten Funktionen: cutby schneidet einem String die vorderen und hinteren Leerzeichen ab und entfernt Kommentare getattribut liest die Farbe im Quelltext aus Der Rest dürfte klar sein... Hab ich vielleicht bei den Compiler-Parametern einen Scheiß eingestellt? |
Re: Kann Delphi jetzt kein s[1] mehr?
Funktion in einer Prozedur, sowas mag ich gar nicht *g*
Teste mal die Funktion einzelnd, ob sie bei dir dann den erwünschten Effekt liefert. |
Re: Kann Delphi jetzt kein s[1] mehr?
Ach Mann:
Delphi-Quellcode:
muss vor der Zeile
position:=scintilla1.positionfromline(i)+countspacesinfront(temp);
Delphi-Quellcode:
stehen, sonst ist ja klar dass 0 rauskommt :-)
temp:=cutby(temp);
Cutby schneidet ja alle Leerstellen ab *g* Aber das mit der AV bleibt. Wenn ich
Delphi-Quellcode:
aber durch
s[1]
Delphi-Quellcode:
ersetze funktioniert es?!
copy(s,1,1)
|
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
Dann würde s[1] auch eine AV verursachen, copy hingegen nicht. MfG Binärbaum |
Re: Kann Delphi jetzt kein s[1] mehr?
Natürlich kommen auch Strings mit Länge 0 vor, daran hatte ich ja gar nicht gedacht!! :wall: :wall:
DANKE!! :love: Gibt es nicht etwas geschickteres als copy(s,1,1)? Sieht so nach "mit Kanonen auf Spatzen"-Schießen aus :zwinker: |
Re: Kann Delphi jetzt kein s[1] mehr?
Du könntest ja mit einer if-Abfrage prüfen, ob der String ein Zeichen hat oder nicht ;)
|
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
Delphi-Quellcode:
Etwa sowas?
if length(s) >=1 then s[1]:= ...
MfG Binärbaum |
Re: Kann Delphi jetzt kein s[1] mehr?
Ich dachte eher ob es eine vordefinierte Funktion gibt die ungefähr so aussehen müßte:
Delphi-Quellcode:
oder so
function gibzeichen(s:string;pos:integer):char;
begin if length(s)>=pos then gibzeichen:=s[pos] else gibzeichen:=''; end;
Delphi-Quellcode:
:mrgreen:
function gibzeichen(s:string;pos:integer):char;
begin gibzeichen:=copy(s,pos,1); end; |
Re: Kann Delphi jetzt kein s[1] mehr?
Schreib dir doch selbst eine :mrgreen:
Delphi-Quellcode:
:zwinker:
function gibzeichen(s: string; pos: integer): char;
begin if length(s) >= pos then result := s[pos] else result := ''; end; |
Re: Kann Delphi jetzt kein s[1] mehr?
Wozu brauchst du da eine vordefinierte Funktion, wenn du die mit wenigen Codezeilen selbst die passende Funktion schreiben kannst? :gruebel:
Und ich dachte immer, nur die C/C++ -Programmierer sind faule Leute :mrgreen: |
Re: Kann Delphi jetzt kein s[1] mehr?
Ey, wie biste blos auf den Quelltext gekommen :?: :?:
Könnte glatt von mir sein :!: :wiejetzt: Ich wollte doch was vordefiniertes... Aber egal, es geht ja jetzt :dp: |
Re: Kann Delphi jetzt kein s[1] mehr?
*g* ich muss schon zugeben dass ich Sachen wie
$s=($i++)+(++$x); in Delphi oder PHP sehr vermisse :drunken: |
Re: Kann Delphi jetzt kein s[1] mehr?
[Kurz OT]
Zitat:
In Delphi brauchst du halt *etwas* mehr Tipparbeit ;) [/Kurz OT] |
Re: Kann Delphi jetzt kein s[1] mehr?
@derpepe: Hier mal eine bedeutend schnellere Variante zum zählen der Leerzeischen (da nicht bei jedem führenden Leerzeischen der String neu zusammengesetzt wird)
Delphi-Quellcode:
var LLen: Integer;
begin result := 1; LLen := Length(AStr); while (result <= LLen) and (AStr[result] = ' ') do inc(result); dec(result); end; |
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
|
Re: Kann Delphi jetzt kein s[1] mehr?
Kommando zurück!
Habs kapiert, sorry :oops: Und da sag nochmal einer Programmieren sei keine Kunst!! |
Re: Kann Delphi jetzt kein s[1] mehr?
Zählen der Leerzeichen geht doch viel einfacher:
Delphi-Quellcode:
[edit=Christian Seehase] Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]
function countspaces(s: String): Integer;
begin Result:=length(s)-length(trimleft(s)); end; |
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
|
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
|
Re: Kann Delphi jetzt kein s[1] mehr?
Tja, kommt halt drauf an, für was man es braucht.
Ich arbeite halt selten mit 2 GB Strings und bin auch noch nicht so erfahren. |
Re: Kann Delphi jetzt kein s[1] mehr?
Nun, ich habe auch selten Strings der Größenordnung 2GB :mrgreen:
Aber im allgemeinen sind da (iterative) Verfahren, die direkt auf den Ausgangsstring zugreifen schneller als wenn man es an eine neue Funktion übergibt, da dafür, wie schon von SirThornberry gesagt, erst neuer Speicher angefordert werden muss. MfG Binärbaum |
Re: Kann Delphi jetzt kein s[1] mehr?
So wirds gemacht:
Delphi-Quellcode:
Und die Testfälle:
function countspacesinfront2(const s: string): Integer;
var i: Integer; begin if Length(s) < 1 then Result := 0 else begin i := 1; while (i <= Length(s)) and (s[i] = ' ') do Inc(i); Result := i - 1; end; end;
Delphi-Quellcode:
memo1.Lines.Add(IntToStr(countspacesinfront2(' Test')) + '=5');
memo1.Lines.Add(IntToStr(countspacesinfront2(' ')) + '=5'); memo1.Lines.Add(IntToStr(countspacesinfront2(' ')) + '=1'); memo1.Lines.Add(IntToStr(countspacesinfront2('')) + '=0'); memo1.Lines.Add(IntToStr(countspacesinfront2('Test')) + '=0'); |
Re: Kann Delphi jetzt kein s[1] mehr?
@blueStarHH:
Das ist doch irgendwie das selbe wie bei SirThornberry :!: |
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
Delphi-Quellcode:
Bei SirThornberry kommt 0 raus. Muss aber 1 sein!
memo1.Lines.Add(IntToStr(countspacesinfront3(' ')) + '=1');
|
Re: Kann Delphi jetzt kein s[1] mehr?
Was mir bei Sir Thornberry's Code auffällt:
Delphi-Quellcode:
Ist Result und LLen(Als Prozedurenname) nicht die gleiche Variable?
result := 1;
LLen := Length(AStr); |
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
[edit]function LLen: Integer ohne Parameter gäbe ja auch wenig Sinn. |
Re: Kann Delphi jetzt kein s[1] mehr?
Das kommt davon, wenn man die ganze Nacht versucht, in eine Mini-IDE OpenGL zu integrieren. Ich bin mittlerweile soweit, dass ich jeden Satz mit einem Semikolon abschließen will;
|
Re: Kann Delphi jetzt kein s[1] mehr?
@BlueStarHH: Stimmt, ist mir gar nicht aufgefallen das ich da das "=" vergessen hatte. Bei deinem Source würde ich empfehlen "Length(s)" auf eine zwischenvariable zuzuweisen da der immer wieder kehrende aufruf von "Length(s)" das ganze sonst etwas langsamer macht. (source wurde also korrigiert)
|
Re: Kann Delphi jetzt kein s[1] mehr?
Zitat:
|
Re: Kann Delphi jetzt kein s[1] mehr?
die if-abfrage macht deinen source aber wieder schneller wenn der String wirklich leer ist da du nicht erst das result auf 1 setzt und anschließend wieder decrementierst so wie es in meinem beispiel der fall ist... naja, danke nochmal das du auf den fehler in meinem source hingewießen hast.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 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-2025 by Thomas Breitkreuz