Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - array auslesen


klausiemausie - Fr 06.02.09 19:28
Titel: array auslesen
ich würde gerne eine entscheidungsstruktur formulieren, die beinhaltet, wenn alle Inhalte eines array, also in meinem fall array[1-35], etnweder den wert 0 oder den wert 1 annehmen, passiert etwas. ich hab schon lange gegrübelt, die arrays mit ner schleife auszulesen und in ne variable zu schreiben, aber zu nem konstruktiven ergebnis bin ich noch nicht gekommen, vielleicht könnt ihr mir weiterhelfen, danke
klaus


Narses - Fr 06.02.09 19:39

Moin!

Ansatz:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Alles0, Alles1: Boolean
begin
  Alles0 := TRUE
  Alles1 := TRUE
  for i = erstesElement to letztesElement do
    Alles0 := Alles0 and (Array[i] = 0)
    Alles1 := Alles1 and (Array[i] = 1)
cu
Narses


jaenicke - Sa 07.02.09 03:32

Wenn du den Vergleich oft benötigst, dann kannst du auch direkt den ganzen Speicherbereich vergleichen. Das sollte schneller gehen, zumindest ist es jedenfalls nur ein Befehl. Dafür übergibst du CompareMem die Adresse eines Arrays, das vorher mit Nullen / Einsen gefüllt wurde und die deines Testarrays.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
type
  TFormX = class(TForm)
  ...
  private
    AllZero, AllOne: array[1..35of Integer;

...

procedure TFormX.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := Low(AllZero) to High(AllZero) do
  begin
    AllZero[i] := 0;
    AllOne[i] := 1;
  end;
end;

...

var
  i: Integer;
  TestArray: array[1..35of Integer;
begin
  for i := Low(TestArray) to High(TestArray) do
    TestArray[i] := 0;
  if CompareMem(@TestArray, @AllZero, Length(TestArray)) then
    ShowMessage('Alles 0!');

  for i := Low(TestArray) to High(TestArray) do
    TestArray[i] := 1;
  if CompareMem(@TestArray, @AllOne, Length(TestArray)) then
    ShowMessage('Alles 1!');

  TestArray[5] := 4;
  if not CompareMem(@TestArray, @AllZero, Length(TestArray)) then
    ShowMessage('Nicht alles 0!');
  if not CompareMem(@TestArray, @AllOne, Length(TestArray)) then
    ShowMessage('Nicht alles 1!');
end;
Wie du an den Meldungen siehst klappt das.


klausiemausie - Sa 07.02.09 18:49

hm das versteh ich nicht, mit dem quell text ( for i := Low(TestArray) to High(TestArray) do TestArray[i] := 0;) wird doch mein ganzer array überschriebe oder nicht?


jaenicke - Sa 07.02.09 18:55

Das ist ja nur als Beispiel gewesen, damit du siehst, dass die Methode klappt. ;-)

An der Stelle soll es ja komplett 0 bzw. 1 sein, damit der Vergleich erfolgreich ist, danach verändere ich einen Wert und die Vergleiche klappen nicht mehr, also wie es sein soll. ;-)


klausiemausie - Sa 07.02.09 19:17

ah gut das hab ich gecheckt, aber wie sieht es aus, wenn ich 3 array vergleichen will? also alles0, alles 1 und der testarray, quasi ob alles vom testarray entweder 0 oder 1 ist?


jaenicke - Sa 07.02.09 19:30

Wenn beide Werte (0 und 1) durcheinander vorkommen können, dann musst du mit einer Schleife durchgehen und jedes Element prüfen ob es 0 oder 1 ist, da geht es anders nicht.


klausiemausie - Sa 07.02.09 19:38

hättest du da vielleicht nen codeansatz für mich?


jaenicke - Sa 07.02.09 19:45

Probiere es doch einfach einmal. Wo ist denn dabei das Problem? Die Abfrage ob es 0 oder 1 ist?

Delphi-Quelltext
1:
if (TestArray[i] = 0or (TestArray[i] = 1then                    


Delete - Sa 07.02.09 20:02


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function NullOderEins: Boolean;
var i: integer;
begin
  for i := Low(TestArray) to High(TestArray) do
    begin
      Result := TestArray[i] in [0,1];
      if not Result then break;
    end;
end;