Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kann Delphi jetzt kein s[1] mehr? (https://www.delphipraxis.net/43035-kann-delphi-jetzt-kein-s%5B1%5D-mehr.html)

derpepe 27. Mär 2005 22:16


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;

ReDoX 27. Mär 2005 22:19

Re: Kann Delphi jetzt kein s[1] mehr?
 
hi,
was geht da nicht?
Muesste das nicht
Delphi-Quellcode:
 result := z;
anstatt
Delphi-Quellcode:
 countspacesinfront:=z;
heißen?

Mfg ReDoX

Torpedo 27. Mär 2005 22:19

Re: Kann Delphi jetzt kein s[1] mehr?
 
Bei mir funktionierts :gruebel: (Delphi 7 Personal)

@Redox: Kann man beides machen.

Matze 27. Mär 2005 22:20

Re: Kann Delphi jetzt kein s[1] mehr?
 
Geht bei mir ohne Probleme, was klappt denn nicht?

mr47 27. Mär 2005 22:21

Re: Kann Delphi jetzt kein s[1] mehr?
 
Könntest du bitte "Geht nicht" etwas präzisieren...

derpepe 27. Mär 2005 22:24

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:
showmessage(inttostr(countspacesinfront(einstring)));
dat Ergebnis ausgeben lasse bekomm ich ne Access Violation...

derpepe 27. Mär 2005 22:25

Re: Kann Delphi jetzt kein s[1] mehr?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Die ganze Funktion lautet so
Delphi-Quellcode:
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;
is a bisserl blöd weil das aus nem Projekt stammt.
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?

Matze 27. Mär 2005 22:29

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.

derpepe 27. Mär 2005 22:33

Re: Kann Delphi jetzt kein s[1] mehr?
 
Ach Mann:
Delphi-Quellcode:
position:=scintilla1.positionfromline(i)+countspacesinfront(temp);
muss vor der Zeile
Delphi-Quellcode:
temp:=cutby(temp);
stehen, sonst ist ja klar dass 0 rauskommt :-)
Cutby schneidet ja alle Leerstellen ab *g*

Aber das mit der AV bleibt.
Wenn ich
Delphi-Quellcode:
s[1]
aber durch
Delphi-Quellcode:
copy(s,1,1)
ersetze funktioniert es?!

Binärbaum 27. Mär 2005 22:37

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von derpepe
Aber das mit der AV bleibt.
Wenn ich
Delphi-Quellcode:
s[1]
aber durch
Delphi-Quellcode:
copy(s,1,1)
ersetze funktioniert es?!

Kann es sein, dass der String zu dem Zeitpunkt leer ist, also die Länge null hat?
Dann würde s[1] auch eine AV verursachen, copy hingegen nicht.

MfG
Binärbaum

derpepe 27. Mär 2005 22:39

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:

malo 27. Mär 2005 22:41

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 ;)

Binärbaum 27. Mär 2005 22:41

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von derpepe
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:

Delphi-Quellcode:
if length(s) >=1 then s[1]:= ...
Etwa sowas?

MfG
Binärbaum

derpepe 27. Mär 2005 22:44

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:
function gibzeichen(s:string;pos:integer):char;
begin
  if length(s)>=pos then
    gibzeichen:=s[pos]
  else
    gibzeichen:='';
end;
oder so
Delphi-Quellcode:
function gibzeichen(s:string;pos:integer):char;
begin
  gibzeichen:=copy(s,pos,1);
end;
:mrgreen:

malo 27. Mär 2005 22:47

Re: Kann Delphi jetzt kein s[1] mehr?
 
Schreib dir doch selbst eine :mrgreen:

Delphi-Quellcode:
function gibzeichen(s: string; pos: integer): char;
begin
  if length(s) >= pos then
    result := s[pos]
  else
    result := '';
end;
:zwinker:

Binärbaum 27. Mär 2005 22:51

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:

derpepe 27. Mär 2005 22:52

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:

derpepe 27. Mär 2005 22:53

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:

malo 27. Mär 2005 23:00

Re: Kann Delphi jetzt kein s[1] mehr?
 
[Kurz OT]
Zitat:

Zitat von derpepe
*g* ich muss schon zugeben dass ich Sachen wie

$s=($i++)+(++$x);

in Delphi oder PHP sehr vermisse :drunken:

Das ist aus Perl, nicht? (Hab gestern ein Buch drüber bei uns gefunden *g*) :)

In Delphi brauchst du halt *etwas* mehr Tipparbeit ;) [/Kurz OT]

SirThornberry 27. Mär 2005 23:01

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;

derpepe 27. Mär 2005 23:09

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von SirThornberry
@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;

Korrigier mich, aber zählt diese Funktion nicht alle Leerzeichen in nem String?

derpepe 27. Mär 2005 23:10

Re: Kann Delphi jetzt kein s[1] mehr?
 
Kommando zurück!
Habs kapiert, sorry :oops:

Und da sag nochmal einer Programmieren sei keine Kunst!!

3_of_8 28. Mär 2005 11:09

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zählen der Leerzeichen geht doch viel einfacher:

Delphi-Quellcode:
function countspaces(s: String): Integer;
begin
Result:=length(s)-length(trimleft(s));
end;
[edit=Christian Seehase] Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]

Khabarakh 28. Mär 2005 12:43

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von 3_of_8
Zählen der Leerzeichen geht doch viel einfacher:

Delphi-Quellcode:
function countspaces(s: String): Integer;
begin
Result:=length(s)-length(trimleft(s));
end;

Und wenn seine Strings steuerzeichenverseucht sind :mrgreen: ?

SirThornberry 28. Mär 2005 12:50

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von 3_of_8
Zählen der Leerzeichen geht doch viel einfacher:
Delphi-Quellcode:
function countspaces(s: String): Integer;
begin
Result:=length(s)-length(trimleft(s));
end;

es geht nicht um die einfachheit sondern um die performance. Und bei Trimleft wird auch wieder erst der speicher für den neuen String angefordert. Wenn man einen 2GB string hat der vorne nur ein leerzeichen hat ist deine Variante der performancekiller schlecht hinn weil dann für 2GB - 1 Byte speicher benötigt wird um das ergebnis von Trimleft zwischen zu speichern.

3_of_8 28. Mär 2005 16:08

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.

Binärbaum 28. Mär 2005 16:18

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

BlueStarHH 28. Mär 2005 16:24

Re: Kann Delphi jetzt kein s[1] mehr?
 
So wirds gemacht:

Delphi-Quellcode:
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;
Und die Testfälle:

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');

Binärbaum 28. Mär 2005 16:26

Re: Kann Delphi jetzt kein s[1] mehr?
 
@blueStarHH:
Das ist doch irgendwie das selbe wie bei SirThornberry :!:

BlueStarHH 28. Mär 2005 16:32

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von Binärbaum
@blueStarHH:
Das ist doch irgendwie das selbe wie bei SirThornberry :!:

Nein, bei dem von SirThornberry ist ein Fehler drin. Test seine Function mal mit

Delphi-Quellcode:
  memo1.Lines.Add(IntToStr(countspacesinfront3(' ')) + '=1');
Bei SirThornberry kommt 0 raus. Muss aber 1 sein!

3_of_8 28. Mär 2005 16:39

Re: Kann Delphi jetzt kein s[1] mehr?
 
Was mir bei Sir Thornberry's Code auffällt:

Delphi-Quellcode:
result := 1;
LLen := Length(AStr);
Ist Result und LLen(Als Prozedurenname) nicht die gleiche Variable?

Khabarakh 28. Mär 2005 16:45

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von 3_of_8
Was mir bei Sir Thornberry's Code auffällt:

Delphi-Quellcode:
result := 1;
LLen := Length(AStr);
Ist Result und LLen(Als Prozedurenname) nicht die gleiche Variable?

da steht nicht "function LLen" sondern "var LLen" :zwinker: , erinnert mich an dieses "Gmäeß eneir Sutide eneir elgnihcesn Uvinisterät ..."

[edit]function LLen: Integer ohne Parameter gäbe ja auch wenig Sinn.

3_of_8 28. Mär 2005 16:51

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;

SirThornberry 28. Mär 2005 17:38

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)

BlueStarHH 28. Mär 2005 18:05

Re: Kann Delphi jetzt kein s[1] mehr?
 
Zitat:

Zitat von SirThornberry
@BlueStarHH: 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.

Da hast Du natürlich Recht. Dein Code ist auch insgesamt schöner, da er ohne eine if-Abfrage auskommt...

SirThornberry 28. Mär 2005 18:07

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 17:15 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