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..35] of 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..35] of 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] = 0) or (TestArray[i] = 1) then |
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!