Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Füllstand eines Arrays ermitteln? (https://www.delphipraxis.net/182831-fuellstand-eines-arrays-ermitteln.html)

wonkos2 20. Nov 2014 16:23

Füllstand eines Arrays ermitteln?
 
Ahoi DP,

aktuell grüble ich über das Problem nach, wie sich der Füllstand eines Arrays auslesen läßt. Gibt es dazu eine Funktion? Wenn nein, wie kann ich das mit Bordmitteln selbst bauen (XE3)? Ein dynamisches Array kann ich leider dazu nicht benutzen.

Hat jemand eine Idee dazu? Wenn ja, bitte ich um Euren Kommentar.

Viele Grüße,

wonkos2

DeddyH 20. Nov 2014 16:24

AW: Füllstand eines Arrays ermitteln?
 
Was soll denn der Füllstand eines Arrays sein? :gruebel:

Daniel 20. Nov 2014 16:31

AW: Füllstand eines Arrays ermitteln?
 
Also Du hast ein Array fester Länge und hast offenbar auch Kriterien anhand derer Du prüfen kannst, ob ein Eintrag des Arrays als "belegt" oder als "frei" gilt.
Ich würde einfach von vorn bis hinten durchlaufen und zählen.

baumina 20. Nov 2014 16:32

AW: Füllstand eines Arrays ermitteln?
 
Du merkst dir einfach beim Array-Füllen wieviel du gefüllt hast. Das wird wahrscheinlich eine Zählvariable sein.

TRomano 20. Nov 2014 16:36

AW: Füllstand eines Arrays ermitteln?
 
@DeddyH: er meint wohl, ob ein Array-Element "belegt" ist oder eben nicht.

Das kommt wohl auf den Typ des Array´s an. Bei z.B. einem Integer-Array muss Du dir darüber im klaren sein, was für Dich "leer" bedeutet ... eine "0" oder was auch immer.

DeddyH 20. Nov 2014 16:37

AW: Füllstand eines Arrays ermitteln?
 
OK, das macht Sinn. Schwierig wird es nur, wenn es kein eindeutiges Kriterium gibt.

TRomano 20. Nov 2014 16:42

AW: Füllstand eines Arrays ermitteln?
 
Genau. Auch eine Null kann eine "Befüllung" eines Integer-Array´s sein. Aber die Kriterien wird der TE wohl kennen ...

wonkos2 20. Nov 2014 17:05

AW: Füllstand eines Arrays ermitteln?
 
Es geht um ein Array [0..x] of char. Es wird links nach rechts befüllt.

Geht das mit der Length-Funktion?

himitsu 20. Nov 2014 17:14

AW: Füllstand eines Arrays ermitteln?
 
Zitat:

Zitat von wonkos2 (Beitrag 1280529)
Geht das mit der Length-Funktion?

Ja, wenn du das Length auf den enthaltenen Text und nicht auf das Array anwendest.

* Array nach String kopieren/casten und Length darüber
* oder Zeiger (PChar) auf Array und dann mit Length (impliziter Cast nach String) oder MSDN-Library durchsuchenlstrlen (Windows.pas)

Geht alles aber nur, wenn die Chars nach den Befüllten #0 sind (zumindestens das Erste von den Leeren).

Der schöne Günther 20. Nov 2014 17:17

AW: Füllstand eines Arrays ermitteln?
 
Ich habe mich damit nie beschäftigt, aber ist der String nicht "zu Ende" sobald irgendwo ein 0-Character auftaucht? Alles danach würde nicht mehr gezählt werden.
Wenn er denn schon ein Char-Array hat wird man mit dem Umwandeln zu vollkommen anderen Typen sicher nicht glücklich wenn man nur wissen will "Wieviele Elemente im Array sind ungleich x?"

himitsu 20. Nov 2014 18:01

AW: Füllstand eines Arrays ermitteln?
 
Nein.

Delphi-Strings sind längengezählt ... die enden da, wo es die längenangabe sagt.

Sie haben aber, aus Kompatibilitätsgründen, zwei #0 hinter dem letzten Zeichen, damit man die Strings ganz einfach nach PChar casten kann.
Dennoch erlaubt der Delphi-String prinzipiell auch das #0 mitten im String.

ShortString's haben kein #0 am Ende, drum geht es dort ausschließlich nach dem Längenbyte.

Und wie man das Ende in einem Char-Array definiert, ist vollkommen "egal", da es dort kein "String"-Ende gibt, weil das Array eben aus einzelnen Chars besteht und das hat grundsätzlich nichts mit einem "String" zu tun.

Klaus01 20. Nov 2014 18:34

AW: Füllstand eines Arrays ermitteln?
 
.. wäre es nicht zielführender die Strings in einer TStringlist zu verwalten.
Anzahl der Elemente kannst du dann mit TStringList.count ermitteln.

Grüße
Klaus

Sir Rufo 20. Nov 2014 18:46

AW: Füllstand eines Arrays ermitteln?
 
Was soll denn damit überhaupt erreicht werden? Wofür wird das benötigt?

In der Regel baut man sich eine Builder-Klasse, die weiß, was dort alles rein soll und darf und die spuckt dann bei Bedarf das richtige Ergebnis aus oder meckert halt mit einer Exception. Eine Eigenschaft
Delphi-Quellcode:
IsValid
geht natürlich auch.
Delphi-Quellcode:
TFooBuilder = class
  procedure Append( ... ); // was auch immer benötigt wird
  function TryAppend( ... ) : Boolean; // wie oben nur ohne Exception
  function Build : TFoo;
  function IsValid : Boolean;
  function TryBuild( out AFoo : TFoo ): Boolean;
end;

wonkos2 21. Nov 2014 09:01

AW: Füllstand eines Arrays ermitteln?
 
Ahoi zusammen,

wenn ich es richtig verstanden habe, endet jeder string mit #0 #0. Die Länge des Strings kann ich mit der Length Funktion abfragen. Soweit, so gut. Ich habe den String nun in ein Array of Char kopiert, welches eine feste Länge maximale Länge hat. Gibt es nun eine Funktion, die mir den Füllstand des Arrays ausgibt, oder muss ich zweimal #0 #0 filtern und der Rest ist mein string? Eine Klasse für das Problem einzusetzen, ist leider überkomplex.

Herzlichen Dank für Eure Kommentare!

wonkos

DeddyH 21. Nov 2014 09:13

AW: Füllstand eines Arrays ermitteln?
 
Kleiner Test:
Delphi-Quellcode:
procedure TFormTest.Button1Click(Sender: TObject);
const
  CONTENT = 'Hallo Welt' + #0; //#0 = Stringendezeichen
var
  Arr: array[0..255] of char;
  idx: integer;
begin
  for idx := 1 to Length(CONTENT) do
    Arr[idx - 1] := CONTENT[idx];
  ShowMessage(IntToStr(StrLen(Arr)));
end;

Bjoerk 21. Nov 2014 09:19

AW: Füllstand eines Arrays ermitteln?
 
Man könnte das Array vorher mit Null Werten füllen. Dann kann man die Länge bestimmen. Ist allerdings Steinzeit und auch fehleranfällig.

Delphi-Quellcode:
const
  cCharNil = #27;
  cMaxCharCount = 100;

type
  TCharArray = array [0..cMaxCharCount - 1] of char;

function GetClearCharArray: TCharArray;
var
  I: integer;
begin
  for I := 0 to cMaxCharCount - 1 do
    Result[I] := cCharNil;
end;

function GetCharArrayCharCount(const Value: TCharArray): integer;
begin
  Result := cMaxCharCount;
  while (Result > 0) and (Value[Result - 1] = cCharNil) do
    Dec(Result);
end;

baumina 21. Nov 2014 09:28

AW: Füllstand eines Arrays ermitteln?
 
-- gelöscht --

Jumpy 21. Nov 2014 09:37

AW: Füllstand eines Arrays ermitteln?
 
Zitat:

Zitat von wonkos2 (Beitrag 1280566)
Ahoi zusammen,

wenn ich es richtig verstanden habe, endet jeder string mit #0 #0. Die Länge des Strings kann ich mit der Length Funktion abfragen. Soweit, so gut. Ich habe den String nun in ein Array of Char kopiert, welches eine feste Länge maximale Länge hat. Gibt es nun eine Funktion, die mir den Füllstand des Arrays ausgibt, oder muss ich zweimal #0 #0 filtern und der Rest ist mein string? Eine Klasse für das Problem einzusetzen, ist leider überkomplex.

Herzlichen Dank für Eure Kommentare!

wonkos

Ist es denn nicht so, das für jedes Zeichen im String ein Array-Slot besetzt ist?
Dann (wenn ich ein String in ein Char-Array kopiere) wären doch soviele Slots besetzt wie sich aus Length(String) ergeben haben?
Irgendwie scheint mir ich sehe das Problem nicht.

divBy0 21. Nov 2014 09:39

AW: Füllstand eines Arrays ermitteln?
 
Kann es sein, dass du einfach nur die Länge des Strings haben möchtest?

DeddyH 21. Nov 2014 09:40

AW: Füllstand eines Arrays ermitteln?
 
So habe ich es auch verstanden.

divBy0 21. Nov 2014 09:43

AW: Füllstand eines Arrays ermitteln?
 
Was spricht dann gegen

Delphi-Quellcode:
const
  MyString = 'Hallo Welt...';

var
  MyStringLength: Integer;

MyStringLength := Length(MyString);
?

Mavarik 21. Nov 2014 10:37

AW: Füllstand eines Arrays ermitteln?
 
Na das ist ja wieder mal ein Glaskugel Thread...
Wie wäre es, wenn Du uns mal sagst:

A.) Was du hast
B.) Was du erreichen willst
C.) Zur Unterstützung der Frage ein bisschen Source

Mavarik...

:stupid: Array Slots... habe ich auch noch nicht gehört...Man(n) lernt nie aus.

Bjoerk 21. Nov 2014 11:12

AW: Füllstand eines Arrays ermitteln?
 
So schlimm isses nun auch wieder nicht? Die Idee mit dem #0 von #15 finde ich übrigens besser als meine Variante.

Delphi-Quellcode:
const
  cMaxCharCount = 100;

type
  TCharArray = array [0..cMaxCharCount - 1] of char;

..

function StrToCharArray(const S: string): TCharArray;
var
  I: integer;
begin
  for I := 1 to Length(S) do
    Result[I - 1] := S[I];
  Result[Length(S)] := #0;
end;

function CharArrayToStr(const Value: TCharArray): string;
var
  I: integer;
begin
  SetLength(Result, StrLen(Value));
  for I := 0 to StrLen(Value) - 1 do
    Result[I + 1] := Value[I];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  A: TCharArray;
begin
  A := StrToCharArray('Hallo');
  Showmessage(Format('%s %d', [CharArrayToStr(A), StrLen(A)]));
  Showmessage(Format('%s %d', [CharArrayToStr(A), Length(CharArrayToStr(A))]));
end;

Jumpy 21. Nov 2014 11:52

AW: Füllstand eines Arrays ermitteln?
 
Zitat:

Zitat von Mavarik (Beitrag 1280581)
:stupid: Array Slots... habe ich auch noch nicht gehört...Man(n) lernt nie aus.

Halb-Ernsthafte Frage:

Was sagt man denn dazu? Items heißen die Dinger bei einer Irgendwas-List, aber beim Array?
Positionen?

Edit: Elemente geht. Danke Google.

p80286 21. Nov 2014 12:49

AW: Füllstand eines Arrays ermitteln?
 
Vielleicht währe es sinnvoll zu erfahren was der TE eigentlich will, sonst diskutieren wir gleich die unterschiedliche interpretation von Ansi- und wide-Chars in einem array of Byte unter Beachtung der unterschiedlichen API-schnittstellen......


Gruß
K-H

wonkos2 21. Nov 2014 13:24

AW: Füllstand eines Arrays ermitteln?
 
Hm, nicht ganz. Die Länge eines Strings mit Length(zeichenkette) zu bestimmen ist ja relativ einfach. Aber wie sieht das Array nach dem Kopieren aus? Werden die abchließenden zwei Zeichen #0 #0 mitkopiert oder nicht? Was steht im Rest des Arrays, wenn es einmal deklariert wurde? Datenmüll oder #0?

mkinzler 21. Nov 2014 13:42

AW: Füllstand eines Arrays ermitteln?
 
Kommt darauf an, wie Du kopierst. Bei Verwendung von StrPCopy wird nur ein #0 kopiert.

Im Rest des ZielArrays steht dann Datenmüll), sollte aber egal sein, wenn das c konforme EOS beachtet wird.

Auf Implementierungsdetails ( #0#0) sollte man sich zudem aber nie verlassen.

http://docwiki.embarcadero.com/Libra...rings.StrPCopy

p80286 21. Nov 2014 13:57

AW: Füllstand eines Arrays ermitteln?
 
Zitat:

Zitat von wonkos2 (Beitrag 1280622)
Aber wie sieht das Array nach dem Kopieren aus?

Das ist ja ganz was neues, kannst Du bitte noch einmal formulieren, was Du eigentlich (erreichen) willst!

Bis jetzt interpretiere ich es so, daß Du einen externen Puffer mit Daten füllen willst??

Gruß
K-H

Sir Rufo 21. Nov 2014 14:26

AW: Füllstand eines Arrays ermitteln?
 
Das "Wofür" muss streng geheim sein, denn das wurde schon mehrfach gefragt - Reaktion = 0 :roll:

wonkos2 24. Nov 2014 09:05

AW: Füllstand eines Arrays ermitteln?
 
Herzlichen Dank für Eure Beiträge! Der Kommentar von Bjoerk brachte mich auf die richtige Spur. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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