![]() |
Delphi-Version: 5
[Erledigt ]Logik-Problem mit and/or-Verknüpfung
Habe gerade einen Blackout.
Problem: Wenn Januar oder Februar im Schaltjahr vorliegt, soll eine Schaltjahreskorrektur vorgenommen werden (1), andernfalls 0. Wörtlich übersetzt:
Delphi-Quellcode:
Funktioniert so nicht.
//Logikfehler
{ if (monat=1) or (monat=2) and isleapyear(jahr) then schaltjahrkorrektur:=1 else schaltjahrkorrektur:=0; } Mit einer Hilfskrücke k Klappt es (Dirty Code).
Delphi-Quellcode:
Wie "denkt" der Compiler?
if (monat=1) or (monat=2) then k:=1 else k:=0;
if isleapyear(jahr) and (k=1) then schaltjahrkorrektur:=1 else schaltjahrkorrektur:=0; |
AW: Logik-Problem mit and/or-Verknüpfung
Hi,
auch wenn ich den Sinn der Sache nicht ganz verstehe, vermut ich dass der Fehler in der Klammerung besteht - and klammert stärker als or. Es steht also aktuell quasi das da:
Delphi-Quellcode:
aber du willst
if (monat=1) or ((monat=2) and isleapyear(jahr)) then
schaltjahrkorrektur:=1 else schaltjahrkorrektur:=0;
Delphi-Quellcode:
if ((monat=1) or (monat=2)) and isleapyear(jahr) then
schaltjahrkorrektur:=1 else schaltjahrkorrektur:=0; LG, Frederic |
AW: Logik-Problem mit and/or-Verknüpfung
Delphi-Quellcode:
Ich versuche sowas zu vermeiden, und mache es so
if (monat=1) or (monat=2) and isleapyear(jahr) then
Delphi-Quellcode:
Ist glaube ich verständlicher zu lesen.
if ((monat=1) or (monat=2)) and isleapyear(jahr) then
|
AW: Logik-Problem mit and/or-Verknüpfung
Sorry, auch mit deinen Klammern funktioniert es nicht.
LG Wolfgang |
AW: Logik-Problem mit and/or-Verknüpfung
@Popov und @fkerber
Ihr hattet recht, es ist ein Klammerproblem. Mit Popovs Klammern funzt es: Danke an Euch LG Wolfgang |
AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Nur der Vollständigkeit halber:
Delphi-Quellcode:
const
CORRECTIONVALUE: array[Boolean] of integer = (0, 1); ... schaltjahrkorrektur := CORRECTIONVALUE[(monat in (1,2)) and IsLeapYear(jahr)]; |
AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Danke Detlef,
in (1,2) hatte ich auch versucht, allerdings mit [] :( |
AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Du hast natürlich Recht, das kommt davon, wenn man direkt im Editor tippt. Vielleicht wäre das so aber lesbarer:
Delphi-Quellcode:
const
CORRECTIONVALUE: array[Boolean] of integer = (0, 1); POSSIBLYWRONGMONTHS = [MonthJanuary, MonthFebruary]; ... schaltjahrkorrektur := CORRECTIONVALUE[(monat in POSSIBLYWRONGMONTHS) and IsLeapYear(jahr)]; |
AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Hmm, sollte
Delphi-Quellcode:
nicht ausreichen?
Result:= ((Month in [1,2]) and IsLeapYear(Year))
Edit: also mein Delphi führt folgendes korrekt aus
Delphi-Quellcode:
function schaltjahrkorrektur(Month, Year: Integer): Boolean;
begin Result:= ((Month in [1,2]) and IsLeapYear(Year)); end; |
AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Wieso sollte es auch nicht, ich habe ja zugegebenermaßen einen Syntaxfehler gemacht. Die 2. Konstante habe ich nur eingeführt, um Magic Values zu vermeiden, man kann natürlich auch auf das Set verzichten und gleich die Konstanten nehmen, aber ich habe so etwas lieber zentral, falls man öfter darauf zugreift (DRY).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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