AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi buchstaben in dynamischen array speichern
Thema durchsuchen
Ansicht
Themen-Optionen

buchstaben in dynamischen array speichern

Ein Thema von furby · begonnen am 3. Mai 2006 · letzter Beitrag vom 3. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#1

buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 13:57
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;
Fabian K
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#2

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 14:01
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#3

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 14:11
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:
setlength(myASCIIarray,ord(s[i])+1);
Flare
Willy Scheibel
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 14:30
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:

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
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 14:43
@ 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.
Fabian K
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#6

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 15:38
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:

SetLength(MyArray,Length(MyArray)+1);
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 15:46
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;
Fabian K
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 16:26
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;
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 16:46
Christian, du hast einen Kommentar vergessen:

// 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
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#10

Re: buchstaben in dynamischen array speichern

  Alt 3. Mai 2006, 16:49
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
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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