![]() |
Mehere Werte auf gleichheit überprüfen
Ich würde gerne mehere Werte auf gleichheit hin überprüfen!
Ungfähr so:
Delphi-Quellcode:
Da mekert wer rum!
var Value : array [1..3] of Byte;
{...} if Value[1] = Value[2] = Value[3] then Showmessage('Subba! Alle Werte sind gleich!') Gibt es schon eine Funktion? Oder muss ich die mir selber machen:
Delphi-Quellcode:
(Aso: Bei 3 Werten geht es noch, aber wer weiß ... wie es nachher bei 10 oder 20 Werten ist?)
Result := (Value[1] = Value[2]) and (Value[2] = Value[3])
|
Re: Mehere Werte auf gleichheit überprüfen
machs doch mit einer for - to schleife
überprüfe ob alle werte des arrays dem wert value[1] entsprechen. |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Eine for schleife wäre definitiv das mittel der wahl. Aber um mal einen weg zu zeigen, der deiner logik entspräche:
Delphi-Quellcode:
So und nicht anders. Wenn du sagtst Result:= dann erwartet delphi da eine zuweisung. Und mit Value[1]=Value[2] erhältst du keinen wert. Du vergleichst nur zwei array werte, aber ohne das ergebnis zu speichern.
if (Value[1]=Value[2]) and (Value[1]=Value[3]) and (Value[2]=Value[3]) then
Result:=true; |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Er hat 2 logischer Vergleiche die einen boolsches Ergebnis liefern und das mit einem logischen UND verknüpft - was soll dabei nicht gehen? |
Re: Mehere Werte auf gleichheit überprüfen
Mit value[1]=value[2] erhält man durchaus einen Wert, nämlich einen Boolean.
Result:=(value[1]=value[2])and(value[2]=value[3]); Ist korrekt. |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Gruß Hawkeye |
Re: Mehere Werte auf gleichheit überprüfen
Das müsste doch gehen, oder?
Delphi-Quellcode:
for Value in Array do
Result:=Result and Value; |
Re: Mehere Werte auf gleichheit überprüfen
Nein. in geht nur bei Sets.
|
Re: Mehere Werte auf gleichheit überprüfen
Die FOR-Schleife ist schon korrekt, schaue mal in der Online-Hilfe nach.
Der Compiler wird sich aber weigern, einen Integer-Wert (Value) mit einem Boolean-Wert (Result)zu verknüpfen... Gruß Hawkeye //Edit: bei Delphi 7 geht's natürlich noch nicht... |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Delphi-Quellcode:
@emteg: wie schon gesagt, erst testen, dann reden. Zusätzlich ist Deine Lösung auch noch falsch, da Result undefiniert wäre, wenn nicht alle Werte den gleichen Wert hätten ;)
var
Cmp: Byte; I: Integer; begin Result := True; if Length(Value) <= 1 then Exit; Cmp := Value[Low(Value)]; for I := Succ(Low(Value)) to High(Value) do begin if Value[I] <> Cmp then begin Result := False; Break; end; end; end; ...:cat:... |
Re: Mehere Werte auf gleichheit überprüfen
Immer diese Sprachfeatureerweiterungen. Ich bleib bei meinem Delphi 7.
|
Re: Mehere Werte auf gleichheit überprüfen
Nehmen wir mal an, D2k5 ist vorhanden, dann wäre diese Lösung doch auch gut:
Delphi-Quellcode:
Oder passt da was nicht?
type TIntegerArray=Array of Integer;
function AreEqual(Values:TIntegerArray):Boolean; Var Key:Integer; FirstKey:Integer; Begin If Length(Values)<1 then exit; FirstKey:=Values[Low(Values)]; for Key in Values do Result:=Result and (Key=FirstKey); End; @sakura: Den Vergleich verstehe ich nicht:
Delphi-Quellcode:
wie kann man mit einem Operator vergleichen?
if Length(Value) <= < then
|
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Zitat:
...:cat:... |
Re: Mehere Werte auf gleichheit überprüfen
Hallo Benjamin,
Du solltest zu Beginn der Funktion deren Rückgabewert noch initialisieren, sonst liefert sie mehr oder weniger zufällige Ergebnisse. :wink: Gruß Hawkeye |
Re: Mehere Werte auf gleichheit überprüfen
Hallo.
Für den speziellen Fall hat xZise ja schon die optimale Lösung. Bei der allgemeinen Lösung für beliebige Array-Größen müsste bei leerem array eigentlich eine Exception geworfen werden.
Delphi-Quellcode:
Grüße vom marabu
function AllBytesEqual(const a: array of byte): Boolean;
var i: Integer; begin Result := false; for i := Succ(Low(a)) to High(a) do if a[i] <> a[Pred(i)] then Exit; Result := Length(a) > 0; end; |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Zitat:
...:cat:... |
Re: Mehere Werte auf gleichheit überprüfen
Danke für die Antworten :)
@ sakura: Ist bei 0 Items (im Array) alle gleich? Zitat:
Seit wann kann man ein Array direkt übergeben? Muss man da nicht erstmal ein Typ davon anlegen, oder ist es anderes weil es
|
Re: Mehere Werte auf gleichheit überprüfen
[quote="emteg"]
Zitat:
natürlich liefert "Value[1]=Value[2]" einen Wert und zwar einen Boolean-Wert der true ist wenn die beiden Werte gleich sind und der false ist wenn beide Werte ungleich sind. Es wird also Result ein Wert zugewiesen (sonst würde dieser Ausdruck ja schon vom Compiler bemängelt. Also:
Delphi-Quellcode:
kann man auch so schreiben:
if Value[1]=Value[2] then Result := true;
Delphi-Quellcode:
Ciao,
Raesult := Value[1] = Value[2];
Ralf |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
das kann man nicht unbedingt so schreiben, da bei einer Zuweisung der vorherige Wert von result auf JEDEN Fall ersetzt wird. Eine if-then-else-Konstruktion kann man durch eine Zuweisung ersetzen. Hier fehlt allerdings der else-Zweig. Den Unterschied merkt man, wenn result vorher schon true ist. Bei
Delphi-Quellcode:
bleibt result true.
if Value[1]=Value[2] then Result := true;
Bei
Delphi-Quellcode:
wird es false.
Result := Value[1] = Value[2];
Gruß Michael [Edit]Wollte dies nur anmerken, da man (mich eingeschlossen) bei solchen "Optimierungen", sprich if-Konstrukte durch Zuweisungen zu ersetzen, oft kleine Fehler macht, die nachher schwer zu entdecken sind.[/Edit] |
Re: Mehere Werte auf gleichheit überprüfen
deine IF THEN Abfrage ist nichts anderes als eine Implikation des vorherigen Wertes von result.
Geht also auch so
Delphi-Quellcode:
oder
Result := Result or (Value[1] = Value[2]);
Delphi-Quellcode:
je nachdem was man erreichen möchte.
Result := Result and (Value[1] = Value[2]);
Es gibt also in diesem Falle keinen Grund eine unnötige Verkomplizierung durch die IF THEN Abfrage zu machen. Normalerweise hängt die Schwierigkeit im Verständnis des Programmieres bei solchen Konstrukten von derem "geschmack" ab. 1.) rein mechanisch denkende Menschen bervorzugen strukturierte IF THEN etc. Blöcke, quasi stückchenweises herangehen an ein Problem durch stückchenweises Ausschlußverfahren. 2.) formal denkende Menschen bevorzugen eine Gleichung/Formel zur Lösung eines Problems. Sie "kodieren" also ein Problem im Kopf so um das sie das Problem ansich als Formel darstellen können. Dies ist in den meisten Fällen besser da dadurch auch die Möglichkeiten entstehen um zb. die Komplexität eines Algos. zu errechnen, quasi sein Laufzeitverhalten. Oder durch einfache Umstellungen der Formeln diese zu verbesern. All das geht mit rei mechnischer Vorgehensweise nicht so leicht. Gruß Hagen |
Re: Mehere Werte auf gleichheit überprüfen
@Hagen:
Mit "and" bzw. "or" ist natürlich auch eine Möglichkeit ;) Wobei man jetzt wieder darüber diskutieren könnte, was schneller ist, wenn (Value[1] = Value[2]) false ist. Schließlich hätte man bei ner Zuweisung ne Schreiboperation, während ein if-Konstrukt in diesem Fall nur lesen würde. |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Wenn nicht:
Delphi-Quellcode:
Nicht schlagen, wenn's BS ist *dummer .Net Fritze ist :P *
function AllEqual(const values : array of Byte) : Boolean;
var firstElement, lastElement, currentElement : PByte; begin if Length(values) > 1 then begin firstElement := @values[Low(values)]; lastElement := @values[High(values)]; currentElement := firstElement; while Integer(currentElement) < Integer(lastElement) do begin Inc(currentElement); Result := currentElement^ = firstElement^; if not Result then Exit; end; end else Result := true; end; |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Heutige CPUs sind daraufhin optimiert gerade den Array-indizerten-record-basierten Zugriff auf den Speicher zu ermöglichen. Dies ist bei weitem effizienter, sowohl im Verständnis, Geschwindigkeit und Verbrauch an Speicher für den Code. Die effizienteste Lösung dürfte darin bestehen ein Element im Array[] zu finden das NICHT identisch mit dem ersten Element des Arrays[] ist. Auf CPU Ebene gibt es den Befehl "scanne Speicherarray auf einen Wert <> X" -> REP SCASD Gruß Hagen |
Re: Mehere Werte auf gleichheit überprüfen
hehe, bin schon ganz lieb und ruhig. Zumindest solange du nun auch einen Schnipsel rausrückst. :mrgreen:
Wer A sagt muss auch ... Code tippen. :P |
Re: Mehere Werte auf gleichheit überprüfen
Zitat:
Und außerdem ist es ziemlich logisch die 2. Konstruktion zu nehmen, weil if nichts anderes ist als zu überprüfen ob das zwischen if und then true ist, und dann bestimmte Dinge zu machen! D.h. das Value[1] = Value[2] ein Bollean zurückgeben MUSS, weil ansonsten würde der Compiler meckern! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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