Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi buchstaben in dynamischen array speichern (https://www.delphipraxis.net/68658-buchstaben-dynamischen-array-speichern.html)

furby 3. Mai 2006 14:57


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;

Pseudemys Nelsoni 3. Mai 2006 15:01

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

Flare 3. Mai 2006 15:11

Re: buchstaben in dynamischen array speichern
 
Delphi-Quellcode:
setlength(myASCIIarray,i+1);
Diese Zeile ist ein bisschen komisch...glaube ich...
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

Hawkeye219 3. Mai 2006 15:30

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:
myASCIIArray : array [Char] of integer;
Damit entfällt die aufwendige Längenanpassung des Arrays, dafür solltest du es vor der Schleife allerdings geeignet initialisieren.

Hast du deine Routine eigentlich schon mit einem Leerstring getestet?

Gruß Hawkeye

furby 3. Mai 2006 15:43

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.

Sascha L 3. Mai 2006 16:38

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

furby 3. Mai 2006 16:46

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;

jim_raynor 3. Mai 2006 17:26

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;

Hawkeye219 3. Mai 2006 17:46

Re: buchstaben in dynamischen array speichern
 
Christian, du hast einen Kommentar vergessen:

Delphi-Quellcode:
// Wenn der Eingabestring mit #0 beginnt, knallt es im folgenden Code
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.

Mein Vorschlag:

Delphi-Quellcode:
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;
Gruß Hawkeye

jim_raynor 3. Mai 2006 17:49

Re: buchstaben in dynamischen array speichern
 
Zitat:

Zitat von Hawkeye219
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.

Ja, du hast recht.

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.
Seite 1 von 2  1 2      

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