Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Umwandeln eines Strings in einen Array (Stringanalyse) (https://www.delphipraxis.net/87231-umwandeln-eines-strings-einen-array-stringanalyse.html)

xelax90 25. Feb 2007 15:17


Umwandeln eines Strings in einen Array (Stringanalyse)
 
Hi leute,
ich bin neu hier und ich hab mal gleich ein kleines Problem:

erstmal zu dem Projekt, an dem ich grad arbeite:
ich versuche gerade einen Taschenrechner mit stringanalyse zu erstellen.
damit es leichter zu rechnen ist, will ich den string (die formel) in einen Array umwandeln.
dabei ist dann jeder zweite eintrag eine Zahl und der rest sind dann operatoren.
da es leider kann ich den Rückgabewert einer funktion nicht als array of string definieren.
deshalb habe ich einen eigenen Typ definiert:

Delphi-Quellcode:
type TStringArray = array of String;
um den array zu erstellen benutze ich diese Funktion:
Delphi-Quellcode:
function getStringArray(term : string):TStringArray ;
var stelle : char;
    i, platz :integer;
    komponennte :string;
    zahlarray : set of char;
    resultarray : TStringArray;
begin
//  resultarray := array [0..10] of string;
  i := 1;
  platz := 0;
  stelle := ' ';
  zahlarray := ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  while stelle <> '' do
  begin
    komponennte := '';
    while term[i] in zahlarray do
    begin
      stelle := term[i];
      komponennte := komponennte + stelle;
      i := i + 1
    end;

    resultarray[platz] := komponennte;
    platz := platz + 1;

    while not (term[i] in zahlarray) do
    begin
      stelle := term[i];
      komponennte := komponennte + stelle;
      i := i + 1
    end;

    resultarray[platz] := komponennte;
    platz := platz + 1
  end;
  result := resultarray
end;
es lässt sich kompilieren, aber es kommt in der Zeile
Delphi-Quellcode:
resultarray[platz] := komponennte;
beim durchlaufen ein Fehler:
Zitat:

Zugriffsverletzung bei Adresse 004042A0 in Modul 'Taschenrechner.exe'.Schreiben von Adresse 00000000

ich hatte mir gedacht dass es davon kommt, dass ich die länge vom Array nicht definiert habe. also habe ich die kommentierte Zeile eingefügt. wenn ich diese einfüge, kommt beim kompilieren der Fehler
Zitat:

Ausdruck erwartet, aber array gefunden.
außerdem weiß ich nicht von forne herein, wie lang der array wird. es soll ja nicht jedes Zeichen in den Array rein.
und hinterher fürs rechnen muss der array komplett voll sein.

ich hoffe, mir kann einer von euch helfen.

xelax90

marabu 25. Feb 2007 15:34

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
Herzlich willkommen in der Delphi-PRAXiS, xelax90.

Du kannst erst dann erfogreich auf resultarray[platz] zugreifen, wenn du den benötigten Speicherplatz auch bereitgestellt hast:

Delphi-Quellcode:
Setlength(resultarray, Succ(platz));
resultarray[platz] := ...
Freundliche Grüße

xelax90 25. Feb 2007 15:46

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
genau sowas hab ich mir auch gedacht, aber was heißt Succ(platz) ??

Matze 25. Feb 2007 15:51

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
Zitat:

Zitat von xelax90
genau sowas hab ich mir auch gedacht, aber was heißt Succ(platz) ??

Setze in der Delphi-IDE den Caret auf "succ" und drücke F1, das wirkt manchmal Wunder:

Delphi-OH:
Unit System

[...]

In Delphi gibt Succ den Nachfolger des Arguments X zurück.

X ist ein Ausdruck mit einem ordinalen Datentyp (einschließlich Int64). Der zurückgegebene Wert ist der Nachfolger von X und hat denselben Datentyp.



Edit: Herzlich Willkommen in der DP!

xelax90 25. Feb 2007 16:50

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
danke,

das habe ich jetzt auch in der Hilfe gefunden, aber ich versteh immernoch nicht, was das mir bringt.

soweit ich das verstehe, gibt es mir den darauffolgenden wert an (also würde, wenn ich succ(4) eingebe, 5 rauskommen oder??)
das macht aber gar keinen sinn, weil die werte strings sind und keine integer oder char.

Der_Unwissende 25. Feb 2007 17:09

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
Zitat:

Zitat von xelax90
soweit ich das verstehe, gibt es mir den darauffolgenden wert an (also würde, wenn ich succ(4) eingebe, 5 rauskommen oder??)
das macht aber gar keinen sinn, weil die werte strings sind und keine integer oder char.

Hi, (und auch von mir nochmal ein Willkommen in der DP :dp:).
Schau Dir mal die Benennung der Variablen vom marabu an. Er wollte damit zeigen, dass Du zwei Variablen verwendest, Platz enthält dabei die Anzahl der Strings die Du schon gefunden hast, also wieviel Platz dein Array benötigt. Findest Du einen neuen String, den Du in das Array einfügen möchtest, dann erhöhst Du diesen Wert und vergrößerst das Array (Du benötigst einen weiteren Platz). Danach kannst Du an dieser Stelle etwas einfügen:
Zitat:

Zitat von marabu
Delphi-Quellcode:
Setlength(resultarray, Succ(platz)); // Vergrößern des Arrays
resultarray[platz-1] := ... // Zugriff auf die neue Stelle (ACHTUNG, es sollte Platz - 1 heißen!)

Platz kannst Du einfach mit 0 initialisieren (einmal ganz am Anfang den Wert 0 zuweisen).

Gruß Der Unwissende

xelax90 25. Feb 2007 17:16

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
oops :oops:
ich hab meinen eigenen code vergessen^^
ok, jetzt hab ich es endlich verstanden.
und eigentlich muss es nicht am ende platz-1 heißen, weil platz gar nicht verändert wird. succ ist eine funktion.

Hador 25. Feb 2007 17:57

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
Zitat:

Zitat von marabu
Delphi-Quellcode:
Setlength(resultarray, Succ(platz)); // Vergrößern des Arrays
resultarray[platz-1] := ... // Zugriff auf die neue Stelle (ACHTUNG, es sollte Platz - 1 heißen!)

Noch kurz zu Succ:
Succ(X) ist das gleiche wie X + 1
und
Pred(X) ist das gleiche wie X - 1

Also macht
Delphi-Quellcode:
Setlength(resultarray, Succ(platz));
und
Delphi-Quellcode:
Setlength(resultarray, platz + 1);
das gleiche.
Dies gilt ebenso für
Delphi-Quellcode:
resultarray[platz - 1] := ...
und
Delphi-Quellcode:
resultarray[Pred(platz)] := ...
Das ganze ist aber nicht zu verwechseln mit inc(X) bzw. Dec(X). Denn das ist das gleiche wie X := X+1 bzw. X := X-1.

xZise 25. Feb 2007 18:13

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
Erstmal :hi:

Abgesehen davon, dass du gar nicht ein "Resultarray" brauchst. Musst du ja sagen, wie viele Einträge dein "TStringArray" hat ;)
Dazu musst du "SetLength(<Array>, <Länge des Arrays>)" aufrufen.

D.h. du musst vor jedem "resultarray[platz] := ..." ein "SetLength(resultarray, platz + 1)" aufrufen.

PS: Entgegen eurer Meinung, muss es "Platz" heißen, da er Platz mit "0" initialisiert.

PPS: Ist das mit absicht "komponennte"?

xelax90 25. Feb 2007 20:36

Re: Umwandeln eines Strings in einen Array (Stringanalyse)
 
das ganze soll wie gesagt ein Taschenrechner sein.
der soll dann sowas, wie gleichungen lösen können oder sowas in der Art.(ich hab bis donnerstag in 2 wochen Zeit^^).
das ist erstmal der erste Anfang meines Arrays.
jetzt habe ich einen viel besseren array, in dem jetzt auch Punkt vor strich berücksichtigt wird.(ich muss ihn nur noch auswerten)
dann baue ich noch klammern ein und dann noch potenzen und und und...^^

also, wenn ich mehr fragen habe, wende ich mich vlt. wieder an euch.

EIN GROßES DANKESCHÖN für die schnelle Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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-2025 by Thomas Breitkreuz