"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

(solved) c++: "variable = ( function1() || function2() );"

wergor 09.12.2014 - 22:19 2208 12
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
in meinem code habe ich einige stellen an denen ich 2 funktionen aufrufe und deren return- werte mit || "verodere".
Code: CPP
bool moving_;
moving_ = accel_stepper_x_->run();
moving_ |= accel_stepper_y_->run();
ich würde den code gerne auf 1 zeile reduzieren, ähnlich wie:
Code: CPP
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
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Zitat von wergor
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
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
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
Code: CPP
moving_ = (accel_stepper_x_->run() | accel_stepper_y_->run());
danke, gelöst :D

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
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
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
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
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
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
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
Scheint problemlos zu funktionieren. Kann man das noch besser machen? Bin für alle vorschläge offen :)

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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
Avatar
Registered: Sep 2002
Location: .
Posts: 1201
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:

Code: CPP
bool const movingHorizontal = accel_stepper_x_->run();
bool const movingVertical   = accel_stepper_y_->run();
bool const moving           = movingHorizontal || movingVertical;

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Zitat von PuhBär
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
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
Zitat von PuhBär
Ich finde das hier eleganter und lesbarer, und es wird ziemlich sicher noch vom Compiler optimiert:

Code: CPP
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
Avatar
Registered: Sep 2002
Location: .
Posts: 1201
Zitat von Ringding
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz