Ob es das Performance-Problem ist, weiß ich nicht (habe mich jetzt nicht reingedacht), aber dynamische Arrays starten mit 0 und enden mit High(Dynamisches Array). Wenn du den Rangecheck (-Cr) aktivierst, sollte der Debugger meckern.
Warum ist das in der While Schleife? Macht für mich auf den ersten Blick keinen großen Sinn. Weil sich Text innerhalb der Schleife nicht verändert oder habe ich was übersehen?
Edit01: OK, hat sich geklärt, such mal nach Pointern bzw. PChar das könnte schneller sein.
@Pluto
die schleife verschiebt den leser
[das ist ein] text der geparsed wird
das [ist ein text] der geparsed wird
das ist [ein text der] geparsed wird
das ist ein [text der geparsed] wird
das ist ein text [der geparsed wird]
hier mal mit den eckigen klammern dargestelt
@Michl ok werde ich mal versuchen
Edit: Ok die änderung auf high hats mal so um ne menge beschleunigt, läuft jetzt in so sofort durch. Was ist an high anders.
Edit2: aber er scheint die while schleife nicht zu verlassen weil er den debugoutput nicht ausgibt
Zuletzt geändert von Dragon am Sa 14. Mai 2016, 20:03, insgesamt 1-mal geändert.
Es gibt einen eingabe text der länge n
dieser wird immer in dreierblöcken erfasst wie hier dargestellt
und in ein array of record eingetragen
[das ist ein] text der geparsed wird
das [ist ein text] der geparsed wird
das ist [ein text der] geparsed wird
das ist ein [text der geparsed] wird
das ist ein text [der geparsed wird]
wenn so ein dreierblock mehr als einmal identisch vorkommt, wird kein neuer eintrag im array of record angelegt, sondern der zähler um 1 erhöht, der für jedes dreierpacket seperat vorhanden ist, innerhalb des array of record
if i = 1 then
begin
for w := 1 to 3 do
begin
t1 := PosEx(' ', text , start);
wort[w] := copy(text, start, t1-start);
start := t1 + 1;
end;
end
else
begin
wort[1] := wort[2];
wort[2] := wort[3];
t1 := PosEx(' ', text , start);
wort[3] := copy(text, start, t1-start);
start := t1 + 1;
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
found := false;
if length(database)>0 then
begin
for i2 := 0 to length(Database)-1 do
begin
if (Database[i2].Wort1 = wort[1]) and (Database[i2].Wort2 = wort[2]) and (Database[i2].Folgewort = wort[3]) then
begin
inc(Database[i2].Anzahl);
found := true;
break;
end;
end;
end;
if not found then
begin
t2 := length(Database);
Setlength(Database, t2 + 1);
Database[t2].Wort1 := wort[1];
Database[t2].Wort2 := wort[2];
Database[t2].Folgewort := wort[3];
Database[t2].Anzahl := 1;
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
sl := TStringList.Create;
sl.Delimiter := ' '; // Leerzeichen als Wort Trenner
sl.QuoteChar := #$0; // keine " als Maskierung
sl.DelimitedText := Text; // durch diese Zuordnung wird der Zugewiesene Text in einzelne Strings
// (Worte in diesem Fall unterteilt)
// dann kannst du dir alles ausschneiden ersparen
t2 := length(Database);
for i:=0 to sl.Count-3 do
// die Schleife beginnt bei 0 (erstes Wort) und aus den letzten zwei Worten kannst Du keine
// dreierkombinationen machen das würde zu Zugriffsverletzungen führen
begin
found := false;
if t2>0 then
begin
for i2 := 0 to t2-1 do
begin
if (Database[i2].Wort1 = sl.strings[i]) and (Database[i2].Wort2 = sl.strings[i+1]) and (Database[i2].Folgewort = sl.strings[i+2]) then
begin
inc(Database[i2].Anzahl);
found := true;
break;
end;
end;
end;
if not found then
begin
Setlength(Database, t2 + 1);
Database[t2].Wort1 := sl.strings[i];
Database[t2].Wort2 := sl.strings[i+1];
Database[t2].Folgewort := sl.strings[i+2];
Database[t2].Anzahl := 1;
t2 := length(Database);
end;
end;
sl.Free;
Zuletzt geändert von gocher am So 15. Mai 2016, 16:25, insgesamt 6-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
wieso rechnest du bei der stringliste in der schleife -3.
und kann man da überhaupt mit einer stringliste arbeiten ich meine muss dann jedes wort nicht in einer extra zeil vorliegen?
Edit1:
Danke für die erweiterten kommentare
habs so mal probiert das programm crasht dann aber mit "EStringListError: List index (416) out of bounds"
Zuletzt geändert von Dragon am So 15. Mai 2016, 16:07, insgesamt 2-mal geändert.