Warum funktioniert dieses Zählerprogramm nicht?

Gast #5387062
Lesenswert?

Hallo Leute,

Ich habe folgendes Programm am laufen, welches auch funktioniert:
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   Flow1Counter = Flow1Counter + 1
3
   Flow1Helper = 1
4
end if
5
    
6
If ((Flow1 = 0) and (Flow1Helper = 1)) then
7
   Flow1Helper = 0
8
end if

Nun wollte ich das optimieren:
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   inc(Flow1Counter)
3
else
4
    Flow1Helper = Flow1
5
end if

Aber warum funktioniert das nicht?????
Beitrag #5387066 wurde von einem Moderator gelöscht.
Gast #5387621
Lesenswert?

WarumNur schrieb:
> Aber warum funktioniert das nicht?????
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   Flow1Counter = Flow1Counter + 1
3
   Flow1Helper = 1
4
end if

Flow-Helper = 1  aus dem IF-Zweig wegoptimiert :-)
                 bleibt im "optimierten" Fall auf 0, wenn inkrementiert 
wird
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   inc(Flow1Counter)
3
else
4
    Flow1Helper = Flow1
5
end if
Gast #5387626
Lesenswert?

Markus F. schrieb:
> WarumNur schrieb:
>> Nun wollte ich das optimieren:
>
> In Anlehnung an den bekannten Spruch mit der übriggebliebenen
> Gemüsesuppe und dem saftigen Rindersteak:
>
> Ein Basic-Programm optimiert man am besten dadurch, indem man es durch
> ein hübsches C- oder Assembler-Programm ersetzt.

Naja so eine Abfrage sollte Basic schon noch können. Aber inc ist mir in 
Basic auch noch nicht unter gekommen. Vielelicht hilft es ja 
Flowcounter=Flowcounter+1 zu schreiben.
#5387736
Lesenswert?

WarumNur schrieb:
> If ((Flow1 = 1) and (Flow1Helper = 0)) then
>    Flow1Counter = Flow1Counter + 1
>    Flow1Helper = 1
> end if
>
> If ((Flow1 = 0) and (Flow1Helper = 1)) then
>    Flow1Helper = 0
> end if

ist eben nicht das selbe wie

> If ((Flow1 = 1) and (Flow1Helper = 0)) then
>    inc(Flow1Counter)
> else
>     Flow1Helper = Flow1
> end if

Der else-Zweig deckt alle Fälle ab, die nicht der if-Bedingung 
entspricht. Das sind in deinem Fall:
 ((Flow1 = 1) and (Flow1Helper = 1))

 ((Flow1 = 0) and (Flow1Helper = 0))

 ((Flow1 = 0) and (Flow1Helper = 1))

du willst aber nur bei
 ((Flow1 = 0) and (Flow1Helper = 1))

die zweite Anweisung ausführen.

Du siehst den Unterschied?

Gruß Reinhard
Moderator (Firma: Titel) Persönliche Seite #5387762
Lesenswert?

Andy schrieb:
> Wenn du einfach du positiven Flanken an Flow1 zählen willst: ...
Richtig, so und nur so wird das gemacht: eine Speichervariable merkt 
sich den alten Wert des Eingangs, damit dieser im Programmablauf mit dem 
aktuellen Wert verglichen werden kann. Und nach diesem Vergeleich wird 
der aktuelle Wert für den nächsten Durchlauf als alten Wert, und das 
Spiel beginnt von vorn.

Diese Vorgehensweise ist vollkommen unabhängig von der 
Programmiersprache (über die übrigens nur die streiten, die nur eine 
oder zwei kennen und können).

WarumNur schrieb:
> Ich habe folgendes Programm am laufen, welches auch funktioniert
Reduzieren wir das Programm einfach mal und nehmen die 
Steigende-Flanken-Zählergeschichte aus der Merker-Geschichte heraus, 
dann sieht der exakt funktionsgleiche Code vom ersten Post so aus:
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5

6
 // Merker verwalten
7
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
8
    Flow1Helper = 1
9
 end if
10
 
11
 If ((Flow1 = 0) and (Flow1Helper = 1)) then
12
    Flow1Helper = 0
13
 end if
Weil Flow1Helper eh' nur 1 oder 0 sein kann, könnte man das auch so 
schreiben (darüber einfach mal eine Minute ausgiebig nachdenken):
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5

6
 // Merker verwalten
7
 If (Flow1 = 1) then
8
    Flow1Helper = 1
9
 end if
10
 
11
 If (Flow1 = 0) then
12
    Flow1Helper = 0
13
 end if
Und damit kann man es auch so schreiben:
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5

6
 // Merker verwalten
7
 Flow1Helper = Flow1
q.e.d.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren