Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi simple for-schleife (https://www.delphipraxis.net/93180-simple-schleife.html)

warefare 1. Jun 2007 19:51


simple for-schleife
 
etwas ganz simples, aber irgendwie ist heut der wurm drin ..
ich habe eine "for schleife" und er soll den ganzen text zeichen für zeichen durchgehen (to length)
das macht er auch wunderbar, aber er fügt der Liste nicht mehr als EINE Positionsangabe hinzu, selbst wenn er es eigentlich müsste.

Code:
for i:= 1 to length(text) do

begin

if (text[i] = 'i') and (text[i+1] = 'm') and (text[i+2] = 'g') then begin

position_g := Pos('img', text);

  s1 := TStringList.Create; // StringList erstellen
  try

    s1.Add(inttostr(position_g));         // in SteringList aufnehmen

 finally
 Memo1.Text := s1.Text;
    s1.Free; // Speicher freigeben
      end;


end

else


end;
end;
Nachdem ich die forensuche mal angeschmissen hatt, habe ich halt noch "continue" und" writeln" hinzugefügt
aber ohne Erfolg.

Bin für jeden Denkanstoß dankbar!

mkinzler 1. Jun 2007 19:54

Re: simple for-schleife
 
1. Falsche Grenze
Delphi-Quellcode:
for i:= 0 to length(text)-1 do begin
Was für ein wert hat x am Anfang?
Was soll das Programm genau machen?

warefare 1. Jun 2007 20:10

Re: simple for-schleife
 
Zitat:

Zitat von mkinzler
1. Falsche Grenze
Delphi-Quellcode:
for i:= 0 to length(text)-1 do begin
Was für ein wert hat x am Anfang?
Was soll das Programm genau machen?


x:= 0;

also ich hab mal grad ne showmessage eingebaut und er führt die if schleife sauber aus aber fügt den wert nicht der liste hinzu
d.h. irgendwas an der liste ist falsch :(

das programm soll im moment nicht viel machen außer die positions werte von "img" in memo1 eintragen bzw in die stringliste damit
ich dann später zugriff auf die werte habe

warefare 1. Jun 2007 20:18

Re: simple for-schleife
 
Doppelpost :x

Namenloser 1. Jun 2007 20:19

Re: simple for-schleife
 
Also ich würde mal sagen, in dem Code ist irgendwie der Wurm drin.
Du hast eine Schleife mit der Variablen i. Dann benutzt du noch eine zweite Variable x, die du, wenn ich das richtig sehe, bei jedem Schleifenaufruf erhöhst. Warum benutze du dann nicht gleich i?
Wenn das zeichen x des texts = i, das darauffolegnde m und das übernächste g ist, passiert folgendes:
Außerdem wird in jedem Durchlauf eine Stringliste erstellt, einer niemals verwendeten Variable zeile eine ebenfalls niemals verwendete Variable n zugewiesen, der Wert der Variablen position_g (dessen Ermittlung ich nicht verstehe) zu der Stringlist hinzugefügt und der Inhalt der Stringliste in Memo1 kopiert. Anschließend wird die Stringliste zerstört, x inkrementiert, der Schleifendurchlauf mittels continue abgebrochen, sodass die sinnferie anweisung writeln(i) nie zur Azsführung kommt.

Andernfalls, wird x inkrementiert, udn der Schleifendurchlauf abgebrochen.


Was soll dieser Code bezwecken, wenn man Fragen darf? Irgendwas hast du da völlig falsch verstanden...



@mkinzler (roter kasten :P)
Nein, wenn schon müsste es heißen
Delphi-Quellcode:
 for i := 1 to length(text) do

edit:
Ok, da ich jetzt den Zweck kenne, werde ich mal versuchen, dass auf meine Art zu lösen.
Delphi-Quellcode:
i := posex('img',text);
while i>0 do
begin
  memo1.lines.add(inttostr(i));
  i := posex('img',text);
end;
Ist ungetestet. Du musst die Unit "strutils" in die uses aufnehmen, um posex bentuzen zu können!

warefare 1. Jun 2007 20:30

Re: simple for-schleife
 
Zitat:

Zitat von NamenLozer


edit:
Ok, da ich jetzt den Zweck kenne, werde ich mal versuchen, dass auf meine Art zu lösen.
Delphi-Quellcode:
i := posex('img',text);
while i>0 do
begin
  memo1.lines.add(inttostr(i));
  i := posex('img',text);
end;
Ist ungetestet. Du musst die Unit "strutils" in die uses aufnehmen, um posex bentuzen zu können!


Also ich benutze delphi 6 und da muss man nicht extra strutils hinzufügen um PosEX zu benutzen
Außerdem braucht PosEx drei Werte (string, substring und offset also wo er anfangen soll), allerdings brauche ich PosEx im Moment nicht.

Ich werde mal sehen was ich mit deiner variante anfangen kann :D danke !


edit: oh das bringt mir net viel da ich es einer stringliste hinzufügen muss und nicht einer memo
Achja nur um das aufzukären .. n war überflüssig und von altem code noch drinne aber ziemlich egal da sowas nicht stört
und x brauchte ich nur als counter

mkinzler 1. Jun 2007 20:40

Re: simple for-schleife
 
Natürlich
Delphi-Quellcode:
for i := 1 to length(text) do
:oops:

inherited 1. Jun 2007 20:47

Re: simple for-schleife
 
Zitat:

Zitat von warefare
edit: oh das bringt mir net viel da ich es einer stringliste hinzufügen muss und nicht einer memo

Du wirst ja wohl in der Lage sein den Code so anzupassen dass er es der Stringliste hinzufügt.

warefare 1. Jun 2007 21:12

Re: simple for-schleife
 
ok posex könnte man doch dafür verwenden

hier der code falls es wen interessiert:

Code:
for i:= 0 to length(text) do

begin

if (text[i] = 'i') and (text[i+1] = 'm') and (text[i+2] = 'g') then begin

position_g := PosEx('img', text, i);
  ShowMessage('Gefunden an Stelle: ' + inttostr(position_g) );

  s1 := TStringList.Create;
  s1.Add(inttostr(position_g));
     refresh;
     memo1.lines.add(s1.text);
     //s1.clear;

     continue;

end

else
   continue;

end;




end;
funktioniert supi

yankee 1. Jun 2007 22:57

Re: simple for-schleife
 
Zitat:

Zitat von warefare
Delphi-Quellcode:
for i:= 0 to length(text) do

begin

if (text[i] = 'i') and (text[i+1] = 'm') and (text[i+2] = 'g') then begin

position_g := PosEx('img', text, i);
  ShowMessage('Gefunden an Stelle: ' + inttostr(position_g) );

Lass mich raten: i ist immer gleich position_g. Warum noch PoSex? Die position hast du mit dem i doch schon!

Ausserdem sehe ich das nicht so, dass das ganz suppi funzt:

text :='i';
Wenn du jetzt deinen Algo darauf anwendest, sieht das beim ersten Zeichen so aus:
if (text[1] = 'i') and (text[2] = 'm') and (text[3] = 'g') then begin
--> AccessViolation!

ultimativ wäre wohl:

Delphi-Quellcode:
i := pos('img',text);
while i>0 do
begin
  memo1.lines.add(inttostr(i));
  i := posex('img',text,i+1);
end;
Also fast genau so wie NamenLozer bereits sagte. Das ist ausserdem deutlich schneller als deine Variante, da die Borlandentwickler die pos(ex) Funktionen direkt in Assembler gecodet haben und sich dabei sehr viele Gedanken gemacht haben, wie das ganze am schnellsten ist :-).


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