if-Abfrage

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

if-Abfrage

Beitrag von leveltwo »

Moin Zusammen,

Ich habe eine Softschaltuhr programmiert und in dieser sollen nach Terminen die Außenbeleuchtung ein bzw ausgeschaltet werden.
Allerdings bekomme ich es nicht hin, dass zum Ende des Termins auch wieder alles ausgeschaltet wird.

Code: Alles auswählen

if (channel[0]=false) AND (channel[1]=false) AND (channel[2]=false) AND (channel[3]=false) AND (beginn<=time) AND (ende>time) then
             SetOutputsFromDB();
 
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
               SetOutputsFromDB();


ist wahrscheinlich einfach nur ein logik Fehler aber ich bin grad zu beschränkt um es zu checken

Vielen Dank schon mal
Zuletzt geändert von m.fuchs am Di 6. Jun 2017, 16:47, insgesamt 1-mal geändert.
Grund: Highlighter hinzugefügt

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: if-Abfrage

Beitrag von theo »

:?:
Was erwartest du jetzt von uns?

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: if-Abfrage

Beitrag von Thandor »

Ich kann nur eines Sagen: Die Verzweigung scheint syntaktisch richtig zu sein aber ob die Semantik stimmt vermag ich mit den gegeben Informationen nicht zu beantworten.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: if-Abfrage

Beitrag von Michl »

Es fehlt zwar eine Frage im ersten Post, gebe trotzdem mal ungefragt meinen Senf hinzu.

Zur besseren Lesbarkeit würde ich derartige Abfragen vereinfachen.

Die Zeile

Code: Alles auswählen

if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
ist mMn besser lesbar so:

Code: Alles auswählen

if (channel[0] or channel[1] or channel[2] or channel[3]) and (ende < time) then

Vermutlich würde ich aber eine Funktion schreiben. Der Code von oben würde dann in etwa so aussehen (ungetestet):

Code: Alles auswählen

function ChannelActivated: Boolean;
begin
  Result := channel[0] or channel[1] or channel[2] or channel[3]// könnte man auch in eine Schleife packen
end;
 
...
 
  if not ChannelActivated and (beginn <= time) and (ende > time) then ...
 
  if ChannelActivated and (ende < time) then ... 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: if-Abfrage

Beitrag von Mathias »

Code: Alles auswählen

function ChannelActivated: Boolean;

Hier würde ich dann ein inline daraus machen, vor allem wen man optimieren will,

Code: Alles auswählen

function ChannelActivated: Boolean; inline;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: if-Abfrage

Beitrag von pluto »

Code: Alles auswählen

if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
               SetOutputsFromDB();

Hier ist vermutlich nur das "ende < time " falsch, mach mal ein ende >=time raus.

Ich kenne zwar die Datentypen nicht, aber es könnte die Ursache sein für den "Fehler".

Edit01: Außerdem rufst du in beiden fällen SetOutputsFromDB auf, die vermutlich in beiden Fälle einfache das gleiche macht.....
MFG
Michael Springwald

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: if-Abfrage

Beitrag von leveltwo »

leveltwo hat geschrieben:

Code: Alles auswählen

if (channel[0]=false) AND (channel[1]=false) AND (channel[2]=false) AND (channel[3]=false) AND (beginn<=time) AND (ende>time) then
             SetOutputsFromDB();
 
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
               SetOutputsFromDB();


l


ein Paar Zusatzinformationen

die Channel stehen für die Lampen die angesteuert werden. ende und beinn sind zeiten die ich aus Terminen aus einer Datenbank beziehe und time ist die aktuelle Zeit.
Mit SetOutputsFromDB werden die in den Datensätzen angegebenen channel umgeschaltet. Die Datensätze werden nach Datum gefiltert also immer nur die Datensätze die das aktuelle Datum betreffen.
Ursprünglich wurden die Datensätze nur nach Wochentag oder Wochenende gefiltert. solange ich die Filter so lasse ist alles in Ordnung sobald ich den Filter für das Datum hinzufüge funktioniert es nicht mehr.
Kann mir jemand sagen warum das so ist oder gibt es noch offene Fragen?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: if-Abfrage

Beitrag von af0815 »

lass dir die Werte für 'ende' und 'time' einmal numerisch anzeigen. Aus deiner Beschreibung her könnte es sein, das du beim hinzufügen des Filters die Werte zerstörst. Ich gehe davon aus, das du TDateTime für 'ende' und 'time' verwendest.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten