if-Abfrage

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

if-Abfrage

Beitragvon leveltwo » 6. Jun 2017, 15:33 if-Abfrage

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 6. Jun 2017, 15:47, insgesamt 1-mal geändert.
Grund: Highlighter hinzugefügt
leveltwo
 
Beiträge: 34
Registriert: 14. Okt 2015, 08:58

Beitragvon theo » 6. Jun 2017, 16:25 Re: if-Abfrage

:?:
Was erwartest du jetzt von uns?
theo
 
Beiträge: 7882
Registriert: 11. Sep 2006, 18:01

Beitragvon Thandor » 6. Jun 2017, 16:54 Re: if-Abfrage

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.
Thandor
 
Beiträge: 103
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 6. Jun 2017, 18:41 Re: if-Abfrage

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; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 6. Jun 2017, 19:45 Re: if-Abfrage

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3195
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 7. Jun 2017, 00:09 Re: if-Abfrage

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6476
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 17.1 Rebecca | 
Nach oben

Beitragvon leveltwo » 7. Jun 2017, 14:29 Re: if-Abfrage

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?
leveltwo
 
Beiträge: 34
Registriert: 14. Okt 2015, 08:58

Beitragvon af0815 » 7. Jun 2017, 16:19 Re: if-Abfrage

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).
af0815
 
Beiträge: 3258
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried