![]() |
buchstaben in dynamischen array speichern
hiHo
Also ich will einen string mit einer schleife durchlaufen und die vorgekommenen buchstaben in einer listbox speichern (Auch mit anzahl)... Dies stellt auch kein problem dar, da ich erst einfach ein array mit der größe 255 verwendet habe( 255 zeichen wegen der 255 ASCII zeichen). Nunja nun ist mir aber aufgefallen, dass es ja mehr als 255 zeichen gibt. Also hab ich es mal mit einem dynamischen array versucht. Das Problem ist nun, dass wenn ich die Größe des arrays in einer schleife ändere, mir irgendwie die daten verloren gehen. Es werden nämlich immer Nur die Zeichen angezeitg wenn ihr dezimalnummer in der ASCII Tabelle kleiner wird. D.h. konkret er zeit 'cba' an und zählt alles korrekt. bei 'abc' jedoch bleibt meine listbox leer. Dies ist ja auch logisch, wenn meine erkenntnis wahr ist, dass das array gelöscht wird sobald ich die größe ändere? So nun meine Frage: Kann man das umgehen? oder liegt mein fehler ganz woanders? P.S. ich will kein aushilfsarray nehmen. Den Umstand ist es mir nicht Wert!
Delphi-Quellcode:
var i: integer;
s1: string; myASCIIarray: array of integer; last:integer; begin listbox1.clear; s1 := editEingabe.text; last := ord(s1[1]); setlength(myASCIIarray,ord(s1[1])+1); for i := 1 to length(s1) do begin if last < ord(s1[i]) then setlength(myASCIIarray,i+1); inc(myASCIIarray[ord(s1[i])]); last := ord(s1[i]); end; for i := 0 to high(myASCIIarray) do if myASCIIarray[i] > 0 then listbox1.Items.add(chr(i)+': '+ IntToStr(myASCIIarray[i])); end; |
Re: buchstaben in dynamischen array speichern
Moin, ein Array löscht seine Items nicht beim vergrössern, der Fehler muss woanders liegen.
Edit: Dummer Post von mir, aber hab keine Zeit (muss gleich in den Garten*g*), aber wnen bis heut Abend keiner was dazu geschrieben hat guck ich nochmal genau!. MfG |
Re: buchstaben in dynamischen array speichern
Delphi-Quellcode:
Diese Zeile ist ein bisschen komisch...glaube ich...
setlength(myASCIIarray,i+1);
Du setzt die Größe deines Arrays auf die position im String, sol ler aber nicht die Größe auf die Ordnungszahl im ASCII-Code von dem Zeichen setzen? Sähe so aus:
Delphi-Quellcode:
setlength(myASCIIarray,ord(s[i])+1);
Flare |
Re: buchstaben in dynamischen array speichern
Hallo furby,
der Typ "string" bezeichnet je nach Compilereinstellung einen kurzen String (ShortString) oder einen Ansistring. In beiden Fällen werden die Zeichen mit 8 Bits codiert, was zu der folgenden Array-Deklaration führt:
Delphi-Quellcode:
Damit entfällt die aufwendige Längenanpassung des Arrays, dafür solltest du es vor der Schleife allerdings geeignet initialisieren.
myASCIIArray : array [Char] of integer;
Hast du deine Routine eigentlich schon mit einem Leerstring getestet? Gruß Hawkeye |
Re: buchstaben in dynamischen array speichern
@ flare... danke der fehler ist mir zum beispiel gar nicht aufgefallen... jetzt funktionierts aber leider immernoch nicht ganz. Immer wenn die nächste Position größer ist als die des vorgängerbuchstabens gehts net.
|
Re: buchstaben in dynamischen array speichern
Du vergrößerst den Array auch irgendwie komisch mit der Schleifenvariable. Glaube nicht, dass das so optimal ist.
Wenn du den Array vergrößern willst, musste folgenden Code nehmen:
Delphi-Quellcode:
SetLength(MyArray,Length(MyArray)+1);
|
Re: buchstaben in dynamischen array speichern
naja ich vergrößere es ja nich mit den schleifenvariaben direkt. gut in dem einen teil hab ichs vergessen aber das hat ja Flare auch schon festgestellt. Ich erhöhe das array immer nur auf die Anzahl des größten zeichens.
Hier nochma der neue quelltext
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var i: integer; s1: string; myASCIIarray: array of integer; last:integer; begin listbox1.clear; s1 := editEingabe.text; last := ord(s1[1]); setlength(myASCIIarray,ord(s1[1])+1); for i := 1 to length(s1) do begin if last < ord(s1[i]) then setlength(myASCIIarray,ord(s1[i])+1); inc(myASCIIarray[ord(s1[i])]); last := ord(s1[i]); end; for i := 0 to high(myASCIIarray) do if myASCIIarray[i] > 0 then listbox1.Items.add(chr(i)+': '+ IntToStr(myASCIIarray[i])); end; |
Re: buchstaben in dynamischen array speichern
Das last darfst du nur in der if-Bedingung setzen, sonst setzt du es auf einen niedrigeren Wert zurück und dein Array wird eventuell beim nächsten Durchlauf gekürzt.
Zudem knallt es böse, wenn der Eingabestring leer ist, deshalb empfehle ich dir folgendes:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var i: integer; s1: string; myASCIIarray: array of integer; last:integer; begin listbox1.clear; s1 := editEingabe.text; // Beim ersten Durchlauf wird das Array dann automatisch auf die größe des ersten Zeichens gesetzt // Ist der String leer, bleibt das Array auch leer und nichts passiert last := 0; for i := 1 to length(s1) do begin if last < ord(s1[i]) then begin setlength(myASCIIarray,ord(s1[i])+1); last := ord(s1[i]); end; inc(myASCIIarray[ord(s1[i])]); end; for i := 0 to high(myASCIIarray) do if myASCIIarray[i] > 0 then listbox1.Items.add(chr(i)+': '+ IntToStr(myASCIIarray[i])); end; |
Re: buchstaben in dynamischen array speichern
Christian, du hast einen Kommentar vergessen:
Delphi-Quellcode:
Ok, ich weiß nicht ob man diesen Fall mit einem Edit-Feld überhaupt testen kann. Eine Initalisierung von last mit dem Wert -1 sollte aber Abhilfe schaffen.
// Wenn der Eingabestring mit #0 beginnt, knallt es im folgenden Code
Mein Vorschlag:
Delphi-Quellcode:
Gruß Hawkeye
procedure TForm1.Button4Click(Sender: TObject);
var ch : char; i : Integer; s1 : string; myASCIIarray : array [Char] of Integer; begin // Zähler initialisieren for ch := #0 to #255 do myASCIIarray[ch] := 0; // Zeichen zählen s1 := editEingabe.Text; for i := 1 to Length(s1) do Inc (myASCIIarray[s1[i]]); // Ergebnis ausgeben listbox1.Clear; for ch := #0 to #255 do if (myASCIIarray[ch] > 0) then listbox1.Items.Add(ch + ': ' + IntToStr(myASCIIarray[ch])); end; |
Re: buchstaben in dynamischen array speichern
Zitat:
Aber nur als Hinweis ;) Er hatte es vorher mit einem Statischen Array gemacht, und wollte es mit einem dynamischen Array machen, da es ja auch mehr als 256 Zeichen geben kann. Zwar nun nicht mit einem normalen String aber mit einem WideString durchaus ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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 by Thomas Breitkreuz