wergor
connoisseur de mimi
|
in meinem code habe ich einige stellen an denen ich 2 funktionen aufrufe und deren return- werte mit || "verodere". bool moving_;
moving_ = accel_stepper_x_->run();
moving_ |= accel_stepper_y_->run();
ich würde den code gerne auf 1 zeile reduzieren, ähnlich wie: moving_ = (accel_stepper_x_->run() || accel_stepper_y_->run());
das funktioniert leider nicht wie gewünscht. wenn accel_stepper_x_->run() true returned, wird accel_stepper_y_->run() gar nicht erst aufgerufen; das passiert erst wenn accel_stepper_x_->run() false returned. gibt es eine (schöne ) möglichkeit das auf eine zeile zu reduzieren?
Bearbeitet von wergor am 09.12.2014, 22:30
|
Denne
Here to stay
|
wenn accel_stepper_x_->run() true returned, wird accel_stepper_y_->run() gar nicht erst aufgerufen; das passiert erst wenn accel_stepper_x_->run() false returned. Und was ist daran das Problem? || entspricht dem logischen ODER. Wenn das erste schon true ist, kann der zweite Ausdruck sein, was es will, denn TRUE OR X = TRUE. So spart man sich Rechenzeit. Oder versteh ich dein Problem falsch?
|
wergor
connoisseur de mimi
|
der gedanke ist mir auch gerade gekommen. mein problem war dass beide funktionen ausgeführt werden müssen. bitweises ODER macht genau was ich will moving_ = (accel_stepper_x_->run() | accel_stepper_y_->run());
danke, gelöst
|
Denne
Here to stay
|
Jep, "|" führt in jedem Fall beide Funktionen aus. Aber wenn eine Funktion eigentlich nur einen boolschen Wert berechnen soll, in dem Minibeispiel aber ausgeführt werden muss, sieht das designtechnisch nicht 100% sauber aus (no offense, kenne ja auch nicht den restlichen Code nicht). Aber schön, dass es nun läuft
|
wergor
connoisseur de mimi
|
in diesem fall: ich will 2 schrittmotoren gleichzeitig bewegen. die funktion run() bewegt einen schrittmotor und returned true, wenn sich der motor bewegt (dh. das eingestellte ziel noch nicht erreicht hat). ich will in moving_ speichern, ob sich zumindest einer der schrittmotoren bewegt.
|
Denne
Here to stay
|
Hmm okay, scheint auf den ersten Blick nicht offensichtlich schlecht zu sein von der Denkweise. Wenn du in keine Probleme rennst, würd ichs einfach mal so lassen
|
wergor
connoisseur de mimi
|
Scheint problemlos zu funktionieren. Kann man das noch besser machen? Bin für alle vorschläge offen
|
Denne
Here to stay
|
Ich würde vllt zwei Methoden erstellen, eine "run"- und "arrivedAtDestination"-Methode. Die run-Methode würde nen bool setzen setzen, wenn das Ziel erreicht ist, wärend die arrivedAtFestination-Methode diesen bool zurück gibt. So sind die zwei Sachen unabhängig von einander, was ihmo "schöner" ist. Aber wenns z.B. für ne Übung in der Uni ist, würde ich mir da nicht den Kopf darüber zerbrechen
|
Ringding
Pilot
|
Es passt schon. Es ist garantiert, dass mit || der zweite Aufruf nicht stattfindet, wenn der erste schon true liefert. Ebenso ist garantiert, dass mit | beide Aufrufe stattfinden.
|
PuhBär
Schau ned so genau
|
Den bitwise operator | würde ich für eine logische Operation nicht verwenden. Es funktioniert zwar mit den meisten Compilern, aber auch nur deswegen, weil "false" als 0 und "true" als 1 implementiert ist. D.h. wenn du den bitwise operator für so etwas verwendest, verlässt du dich auf ein Implementationsdetail des Compilers. Ich finde das hier eleganter und lesbarer, und es wird ziemlich sicher noch vom Compiler optimiert: bool const movingHorizontal = accel_stepper_x_->run();
bool const movingVertical = accel_stepper_y_->run();
bool const moving = movingHorizontal || movingVertical;
|
Ringding
Pilot
|
Den bitwise operator | würde ich für eine logische Operation nicht verwenden. Es funktioniert zwar mit den meisten Compilern, aber auch nur deswegen, weil "false" als 0 und "true" als 1 implementiert ist.
D.h. wenn du den bitwise operator für so etwas verwendest, verlässt du dich auf ein Implementationsdetail des Compilers. Nein, das ist so definiert. Es muss genau so implementiert sein.
|
wergor
connoisseur de mimi
|
Ich finde das hier eleganter und lesbarer, und es wird ziemlich sicher noch vom Compiler optimiert:
bool const movingHorizontal = accel_stepper_x_->run();
bool const movingVertical = accel_stepper_y_->run();
bool const moving = movingHorizontal || movingVertical;
danke, das schaut gut aus, werde ich übernehmen ist nichts für die uni, sondern ein privats arduino projekt.
|
PuhBär
Schau ned so genau
|
Nein, das ist so definiert. Es muss genau so implementiert sein. Stimmt, ist im C++ Standard so definiert. Bei C bin ich mir nicht sicher. Ich halte mich trotzdem an diese Regel: http://timmurphy.org/2012/05/08/boo...uals-bool-in-c/Bitwise und logical sind einfach unterschiedliche Operationen und man sollte sie nicht vermischen.
|