Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Auto hält nicht an roter Ampel (https://www.delphipraxis.net/155912-auto-haelt-nicht-roter-ampel.html)

snears 12. Nov 2010 18:05

Auto hält nicht an roter Ampel
 
Guten Abend Delphi-Freunde,

ich soll für die Schule eine Ampelschaltung programmieren, nur leider funktioniert eine Sache noch nicht
und zwar, wie der Titel schon verrät, hält das Auto (shape Komponente) nicht bei rot.

Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
begin

if (auto1.left = 120) and (rot.Visible = true) then
   begin
   auto1.left := 160;
   end
else
 begin
 auto1.left := (auto1.left +3);
 if auto1.left = 720 then
  auto1.left := 0;
 end;
end;

das problem ist, das wenn es rot ist hält das shape (auto1) nicht an sonder fährt weiter und dann fährt es nicht bis zum punkt 720 sondern noch viel weiter... habe noch versucht erst abzufragen ob es rot ist und dann ob der wagen bei punkt 140 ist damit er dannach anhält.

Ich hoffe ihr könnt mir helfen

Mit freundlichen Grüßen

snears

DeddyH 12. Nov 2010 18:10

AW: Auto hält nicht an roter Ampel
 
Versuch mal
Delphi-Quellcode:
if auto1.left >= 720 then

Klaus01 12. Nov 2010 18:11

AW: Auto hält nicht an roter Ampel
 
Hallo,

vielleicht solltes du auf <= prüfen.
Es kann ja sein, wenn Du die Position immer um 3 erhöhst,
den Wert (120) nie genau triffst.

Grüße
Klaus

snears 12. Nov 2010 18:20

AW: Auto hält nicht an roter Ampel
 
Also jetzt ist zumindest das Problem weg, dass es bis in die unendlichkeit fährt.
Aber es bleibt nicht stehen sondern fängt nun an von 160 an zu fahren :(
auch wenn ich noch eine abfrage dazwischen schiebe funktioniert es nicht :shock::shock:

jfheins 12. Nov 2010 18:20

AW: Auto hält nicht an roter Ampel
 
Es könnte auch sein, dass die Bedingung im if einmalig zutrifft aber das Auto dann bewegt wird, sodass der nächste Durchlauf wieder in den else-Zweig geht :stupid:

snears 12. Nov 2010 18:22

AW: Auto hält nicht an roter Ampel
 
ah okay ich habe das problem gefunden

Delphi-Quellcode:

if (auto1.left <= 120) and (rot.Visible = true) then
   begin
   auto1.left := 120;

   end
else
 begin
 auto1.left := (auto1.left +3);
 if auto1.left >= 720 then
  auto1.left := 0;
 end;
einfach nur gucken... aber das fällt schon schwer :-D :lol:

himitsu 12. Nov 2010 18:37

AW: Auto hält nicht an roter Ampel
 
Da sich dein Auto nicht in Einerschritten bewegt, mußt du also auf Bereiche und keine genauen Werte prüfen, so daß dein Auto dieses auch trifft.

> oder < bringt nicht viel, wenn sich der Bereich mitten im Raum befindet.

Tipp: Auf "= true" prüft man nicht.

Delphi-Quellcode:
if rot.Visible and (auto1.left >= 120) and (auto1.left < 120 + 3) then
begin
  auto1.left := 120;
end
else
  begin
    auto1.left := auto1.left + 3;
    if auto1.left >= 720 then
      auto1.left := 0;
  end;
Und wenn man das Ganze noch etwas umstellt, dann wird der Code kürzer und man spart sich das unnötige Setzen auf 120, wo dasAuto schon dort ist.
Delphi-Quellcode:
{ wenn nicht (rot und an Ampel), dann fahren }
if not (rot.Visible and (auto1.left >= 120) and (auto1.left < 120 + 3) then
  ...

// bzw.

{ nur wenn nicht Rot oder vor Ampel oder hinter Ampel, dann fahren }
{ aka: nur wenn nicht Rot oder nicht an der Ampel, dann fahren }
if not rot.Visible or (auto1.left < 120) or (auto1.left >= 120 + 3) then
begin
  { ein Stückchen fahren } 
  auto1.left := auto1.left + 3;
  { wenn aus dem Bild raus, dann auf Anfang }
  if auto1.left >= 720 then
    auto1.left := 0;
end;

Delphi-Laie 12. Nov 2010 21:25

AW: Auto hält nicht an roter Ampel
 
Zitat:

Zitat von snears (Beitrag 1061194)
Code:
(rot.Visible = true)

Eine Boolesche Variable über einen Vergleich auf ihren Wahrheitsgehalt zu prüfen, ist zumindest unelegant und überflüssig, vielleicht kann das sogar zu Fehlern im Programmablauf führen. Boolesche Variablen können nämlich stattdessen direkt auf ihren Wahrheitsgehalt geprüft werden.

DeddyH 13. Nov 2010 11:21

AW: Auto hält nicht an roter Ampel
 
Es kann tatsächlich zu Fehlern führen. Siehe Über den Umgang mit Boolean

Caps 13. Nov 2010 19:50

AW: Auto hält nicht an roter Ampel
 
Zitat:

Zitat von DeddyH (Beitrag 1061242)
Es kann tatsächlich zu Fehlern führen. Siehe Über den Umgang mit Boolean

Oh Mann! Dass man Integer auf Boolean casten kann, hätte ich bei der "streng typisierten Sprache" Pascal eigentlich nicht erwartet. Bisher bin ich nämlich davon ausgegangen, dass <Boolean> = <Wahrheitswert> stets dem Ausdruck <Wahrheitswert> = <Wahrheitswert> entspricht und zu keinerlei Problemen führen könnte. Ob Nikolaus Wirth das gewollt hätte? :gruebel: (vorausgesetzt, es ist nicht schon seine Erfindung :stupid:)

Caps

himitsu 13. Nov 2010 21:07

AW: Auto hält nicht an roter Ampel
 
Ein Boolean ist 1 Byte groß und kann somit 256 Werte annehmen.

die Konstanten sind dabei so definiert:

für den delphieigenen Boolean
True = 1
False = 0

für die Windowstypen ByteBool (ShortInt), WordBool (SmallInt) und LongBool (Integer/LongInt)
True = -1
False = 0

wobei es bei der Prüfung aber so lautet
True <> 0
False = 0


Tja, nun fällt auch auf, warum es zu Problemen kommen kann
Delphi-Quellcode:
if myBoolean = True then
ergibt
Delphi-Quellcode:
if Byte(myBoolean) = 1 then
,
wärend
Delphi-Quellcode:
if myBoolean then
intern so
Delphi-Quellcode:
if Byte(myBoolean) <> 0 then
aussieht.

Caps 13. Nov 2010 23:19

AW: Auto hält nicht an roter Ampel
 
Ja, das ist schon klar; was ich meine ist auch bloß, dass hier das Zweiwertigkeitsprinzip der Aussagenlogik in der Delphi-Aussagenlogik nicht mehr erfüllt ist, zumindest dann nicht, wenn es mehr Wahrheitswerte als true und false gibt, oder wenn man mit true und false nicht alle ("2") Fälle abdecken kann. Als Unwissender kann man darüber stolpern. Vor allem als Mathematiker.

Bummi 14. Nov 2010 02:52

AW: Auto hält nicht an roter Ampel
 
Zitat:

Vor allem als Mathematiker.
Ich verstehe nicht was einen Mathematiker hier von einem Normalbürger unterscheidet.
Eine Variable die auf einem Bit abgebildet werden müsste wird für TRUE je nach Gusto als $FFFFFFFF oder als 1 abgebildet, ein <> 0 dürfte in jedem Fall der Überprüfung standhalten. Interessanter finde ich dass folgende Konstrukte funktionieren...
Delphi-Quellcode:
const
 true=0=1;
var
  b:Boolean;
begin
  b := true;
  if b then Showmessage('true') else Showmessage('False');
end;

wenn man sich vorstellt ein Drittanbieter könne eine derartige Deklaration verwenden....

Caps 14. Nov 2010 10:48

AW: Auto hält nicht an roter Ampel
 
Ok, das ist schon heftig :wink:.
Und es wird ein bisschen off-topic...
Interessant finde ich, dass true offenbar kein reserviertes Wort ist. Die Frage ist: verwendet Delphi jetzt lokal immer Dein selbstdefiniertes true? Sollte es eigentlich, gel?

Naja, für logische Ausdrücke kann man ja immerhin stets die Ausdrücke (1=1) für wahr und (0=1) für falsch verwenden, natürlich ohne cast... :-D

Caps

himitsu 14. Nov 2010 10:57

AW: Auto hält nicht an roter Ampel
 
True und False sind Konstanten.
Und innerhalb eines anderen Gültigkeitsbereich kann man Typen, Konstanten und Variablen lokal neu deklarieren.

PS: Es gibt doch 2 Zustände?
Delphi-Quellcode:
False
und
Delphi-Quellcode:
not False
aka =0 und <>0. :angle2:

Caps 15. Nov 2010 11:01

AW: Auto hält nicht an roter Ampel
 
Zitat:

Zitat von himitsu (Beitrag 1061380)
PS: Es gibt doch 2 Zustände?
Delphi-Quellcode:
False
und
Delphi-Quellcode:
not False
aka =0 und <>0. :angle2:


Ja, aber hier (Delphi) kann gelten:
Code:
a := 2; // (a = not false) ist wahr
b := 1; // (b = not false) ist wahr

c := (a = b);
// c ist falsch, in der Aussagenlogik wäre c aber wahr (nur wenn a, b Wahrheitswerte sind),
// weil immer gilt (not false = not false).
// Weil es in der Aussagenlogik keine verschiedenen "not false" geben kann.

Sir Rufo 15. Nov 2010 11:15

AW: Auto hält nicht an roter Ampel
 
Zitat:

Zitat von Caps (Beitrag 1061565)
Zitat:

Zitat von himitsu (Beitrag 1061380)
PS: Es gibt doch 2 Zustände?
Delphi-Quellcode:
False
und
Delphi-Quellcode:
not False
aka =0 und <>0. :angle2:


Ja, aber hier (Delphi) kann gelten:
Code:
a := 2; // (a = not false) ist wahr
b := 1; // (b = not false) ist wahr

c := (a = b);
// c ist falsch, in der Aussagenlogik wäre c aber wahr (nur wenn a, b Wahrheitswerte sind),
// weil immer gilt (not false = not false).
// Weil es in der Aussagenlogik keine verschiedenen "not false" geben kann.

Hier werden aber gerade Birnen mit Äpfel verglichen.
Code:
a := 2
Bool( a ) => not false

( a = b ) => false
( Bool( a ) = Bool( b ) ) => true

Caps 15. Nov 2010 11:52

AW: Auto hält nicht an roter Ampel
 
Klar, mit einem expliziten Cast funktioniert's natürlich.
Aber ohne Cast kriegt man Probleme, das ist eigentlich schon alles.

generic 15. Nov 2010 12:26

AW: Auto hält nicht an roter Ampel
 
Wenn es schon ein Auto Objekt gibt, warum gibt es kein Ampel Objekt?

himitsu 15. Nov 2010 13:11

AW: Auto hält nicht an roter Ampel
 
Und vergiß das Straßenobjekt nicht. :)

es geht auch mit rein logischen Mitteln :stupid:
Delphi-Quellcode:
if a <> b then
=
Delphi-Quellcode:
if a xor b then
Delphi-Quellcode:
if a = b then
=
Delphi-Quellcode:
if (a and b) or (not a and not b) then
,
Delphi-Quellcode:
if not (a xor b) then


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz