www.mikrocontroller.net

Forum: Compiler & IDEs rechnen mit dem Ergebnis eines Vergleichs?


Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es geht um folgende Zeile:
vector[ptr+1][3]=vector[ptr+1][2]-(richtung==1)+(richtung==2);
Ich weiß das man es anders schreiben kann aber aufgrund der 
Übersichtlichkeit wollte ich es so schreiben. Warum funktioniert es 
nicht das man zu dem Wert aus vector[ptr+1][2] eins addiert wenn 
richtung==2 bzw. eins subtrahiert wenn richtung==1.

Gibt es eine Möglichkeit das zu machen ohne zwei if-Abfragen zu 
erstellen?

Müsste (richtung==1) nicht 1 bzw. 0 als Ergebnis der Abfrage liefern?


gleiches Problem weiter unten:
vector[ptr+1][3]=vector[ptr+1][2]+(richtung==4)-(richtung==3);

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben schrieb:
> Müsste (richtung==1) nicht 1 bzw. 0 als Ergebnis der Abfrage liefern?

nein muss es nicht. Es muss 0 oder !0 liefern und !0 muss nicht 1 sein.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben schrieb:
> Warum funktioniert es
> nicht das man zu dem Wert aus vector[ptr+1][2] eins addiert wenn
> richtung==2 bzw. eins subtrahiert wenn richtung==1.

Warum sollte es denn nicht funktionieren?

Peter schrieb:
> nein muss es nicht. Es muss 0 oder !0 liefern und !0 muss nicht 1 sein.

Nein. Ein Vergleich liefert immer 0 oder 1. Es wird lediglich umgekehrt 
dort, wo ein boolescher Wert erwartet wird, alles, was nicht 0 ist, als 
"true" interpretiert.

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> ben schrieb:
>> Müsste (richtung==1) nicht 1 bzw. 0 als Ergebnis der Abfrage liefern?
>
> nein muss es nicht. Es muss 0 oder !0 liefern und !0 muss nicht 1 sein.

Nagut das stimmt aber beim testen des Programms liefert es 
offensichtlich immer 0 egal welchen wert richtung hat.

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst mal das hier versuchen:
vector[ptr+1][3]=vector[ptr+1][2]+((richtung==1)?-1:((richtung==2)?+1:0))
(wahrscheinlich kann man da Klammern einsparen, aber da müsste ich jetzt 
über die Priorität des ?:-Operators nachdenken...)
aber ehrlich gesagt fände ich es so:
if(richtung == 1) {
  vector[ptr+1][3] = vector[ptr+1][2] - 1;
} else if(richtung == 2) {
  vector[ptr+1][3] = vector[ptr+1][2] + 1;
} else {
  vector[ptr+1][3] = vector[ptr+1][2];
}

oder so:
switch(richtung){
  case 1:
    vector[ptr+1][3] = vector[ptr+1][2] - 1;
    break;
  case 2:
    vector[ptr+1][3] = vector[ptr+1][2] + 1;
    break;
  default:
    vector[ptr+1][3] = vector[ptr+1][2];
}
übersichtlicher.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit:

vector[ptr+1][3] = vector[ptr+1][2];

if (richtung == 1)
    vector[ptr+1][3]--;

if (richtung == 2)
    vector[ptr+1][3]++;

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Persönlich fände ich es deutlich übersichtlicher mit einem switch:
   ... temp;
   switch (richtung) {
     case 0: temp = vector[ptr+1][2]; break;
     case 1: temp = vector[ptr+1][2] - 1; break;
     case 2: temp = vector[ptr+1][2] + 1; break;
   }
   vector[ptr+1][3] = temp;

... wobei richtung vorzugsweise noch ein enum werden sollte.

Der sich daraus ergebende Code sollte bei einem vernünftigen Compiler
(wir sind ja im GCC-Forum ;-) identisch zu obigem "kompakten" Konstrukt
sein.

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok es geht doch so wie ich im ersten Post geschrieben hab, ich Trottel 
hab nur vergessen richtung nach den benutzen auf 0 zu setzen und das hat 
einen  Fehler verursacht hat der so aus sah als ob +(richtung==x).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben schrieb:

> Gibt es eine Möglichkeit das zu machen ohne zwei if-Abfragen zu
> erstellen?

Deine Zeile wird je nach zugrundeliegender Maschine und Qualität des 
Compilers aufwendigeren Code erzeugen als if-Abfragen.

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nicht geht

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> ben schrieb:
>
>> Gibt es eine Möglichkeit das zu machen ohne zwei if-Abfragen zu
>> erstellen?
>
> Deine Zeile wird je nach zugrundeliegender Maschine und Qualität des
> Compilers aufwendigeren Code erzeugen als if-Abfragen.

Dieser Abschnitt wird nur 2 mal alle ~160.000 Takte aufgeführt da hab 
ich es lieber übersichtlich und "langsam" als Komplizieren und schnell 
;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben schrieb:

> Dieser Abschnitt wird nur 2 mal alle ~160.000 Takte aufgeführt da hab
> ich es lieber übersichtlich und "langsam" als Komplizieren und schnell

... aber wenn du diesen Code in ein paar Jahren erneut ansiehst, dann 
wirst du den Sinn der if-Version wahrscheinlich deutlich schneller 
erfassen, als die Version mit den eingerechneten Vergleichen. Erst recht 
jeder andere Leser.

Dem kannst du natürlich entgegenwirken, indem du selbsterklärenden Code 
durch den verknoteten Ersatzcode und ausführlich erklärende Kommentare 
ersetzt ;-).

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, was mit "richtung" sonst noch passiert, aber evtl. läßt 
sich der übrige Code dahingehend anpassen, daß statt 1 und 2 die Werte 
-1 und 1 verwendet werden, dann kannst Du einfach schreiben:
vector[ptr+1][3] = vector[ptr+1][2] + richtung;

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:

> ... aber wenn du diesen Code in ein paar Jahren erneut ansiehst, dann
> wirst du den Sinn der if-Version wahrscheinlich deutlich schneller
> erfassen, als die Version mit den eingerechneten Vergleichen. Erst recht
> jeder andere Leser.

Nagut aber wenn ich die 1 bis 4 die richtung neben 0 annehmen kann durch 
ein define mit hoch,runter,links,rechts ersetze dann kann ich den code 
sicher besser erfassen als mit noch einer if Schachtelungstiefe.
(mein koordinatenursprung ist oben links deswegen bei hoch -1 usw.)


@R. Max: Nein geht leider nicht, aber ich könnte richtung aufspalten in 
richtung_horizontal und richtung_vertikal, dann würde das funktionieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.