Pages: [1]   Go Down
Author Topic: Was bedeutet ? :  (Read 1100 times)
0 Members and 1 Guest are viewing this topic.
Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kann mir jemand die Bedutung von der Syntax erklären?
int on = bitRead(cmd, bit) ? 1056 : 395;

Ist es so, dass on bei 0 mit 1056 geladen, und bei 1 mit 395 geladen wird?
Versteht man darunter einer Skalierung??
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist die in C ( und zB auch in PHP) mögliche Kurzform von

Code:
if(bitRead(cmd, bit)==1)
  {
  on = 1056;
  }
else
  {
  on = 395;
  }

Grüße Uwe
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Besten Dank.
Logged

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 383
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für das Beispiel, an solchen Sachen verzweifle ich gerade regelmäßig, wenn ich fremden Code lese.
Gibt es einen Parser oder irgendetwas, welches C Code in die ausführlichstmögliche Schreibweise zurückverwandelt? Oder eine Liste, wo ALLE diese Kniffe, Optimierungen und Kurzformen drinstehen?

Es ist extrem frustrierend, wenn ich Stunden benötige, um 2 Zeilen Code (vielleicht) zu verstehen...

Was macht man da, außer geduldig viel Erfahrung sammeln? Muß doch mal ein C Buch her? Welches?

Helmuth (abgetörnt)

edit: Warum benutzen Leuten überhaupt solche krypischen Formulierungen? Weil es cool ist? Damit es nur Eingeweihte verstehen? Ich habe den Eindruck, dass bei vielen Projekten nur der uninteressante Teil des Codes ausführlich kommentiert wird...
« Last Edit: March 05, 2013, 01:27:52 pm by Helmuth » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 170
Posts: 3203
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist die in C ( und zB auch in PHP) mögliche Kurzform von

Code:
if(bitRead(cmd, bit)==1)
  {
  on = 1056;
  }
else
  {
  on = 395;
  }

Nö, das sehe ich nicht so. Dein Code ist trotz der Länge kein vollständiger Ersatz für die Kurzform, da die Deklaration von "on" fehlt.

Für mich ist es daher eher eine Kurzform von:
Code:
 int on;
  if (bitRead(cmd, bit)) on=1056; else  on= 395;

;-)

Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1145
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@jurs
ist das jetzt smartshitting  smiley-razz smiley-grin
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Stuttgart
Offline Offline
God Member
*****
Karma: 13
Posts: 513
logic enrichments
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Warum muss ich jetzt an die damaligen Zeiten denken, wo es Wettbewerbe für den C64 gab, indem man den wildesten Einzeiler schreiben sollte. smiley-grin

Manche Leute haben es hinbekommen, winzige Maschinencodes in eine Zeile zu quetschen, die dann sogar noch funktionsfähig und genial waren. Aber soetwas habe ich mit meinen bescheidenen Programmierkenntnissen nie hinbekommen:)
Logged

Eine Kuh macht muuhh.
Viele Kuehe machen Muehe

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Man möge großzügig sein und mir das unterschlagene "int" verzeien und mir keinem Strick daraus drehen.
Ok Danke. Jetzt fühle ich mich besser.


?: in der im Beispiel verwendeten Form
int on = bitRead(cmd, bit) ? 1056 : 395;
ist keine vollwertiger Ersatz von IF ELSE sondern eher eine bedingte Zuweisung von Werten einer Variablen.

?: wird verwendet, weil es kürzer ist und weniger zu schreiben ist. Wenn man es einmal verstanden hat, dann ist es gleich einfach zu verstehen wie ein IF-ELSE.

@Helmuth
Ich kann Dir keine Quelle nennen, noch fallen mir weitere solche Kniffe ein. Ich kann Dir nicht weiterhelfen.

Grüße Uwe
Logged

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 383
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Uwe: Ich glaube, mein Problem ist, dass ich manche Operatoren noch nicht sofort als solche erkenne bzw. mir die Erfahrung fehlt, zu verstehen / mir vorzustellen, was sie exakt bewirken, warum sie an dieser Stelle verwendet werden...

Hab´mich wieder beruhigt, ich arbeite dran.

Grüße  smiley-wink
« Last Edit: March 05, 2013, 02:16:26 pm by Helmuth » Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Unterschied ist, daß "if" eine Anweisung und "?:" ein dreistelliger Operator ist. Das wird besonders auffällig wenn man Konstanten deklariert. Mit der "if" Anweisung kann man nicht sinnvoll Konstanten deklarieren mit "?:" schon. Der Operator ist außerdem gut lesbar wenn man das Idiom kapiert hat und vernünftig einrückt.

http://blog.blinkenlight.net/experiments/basic-effects/lighthouses/ liest sich mit "?" deutlich besser als mit "if".

Und hier ein Beispiel wo ich ausnutze, daß "?" zur Compilezeit ausgewertet werden kann:

http://blog.blinkenlight.net/experiments/removing-flicker/knight-rider-no-flicker/

Allerdings könnte man beim letztgenannten Beispiel auch geschickter Einrücken smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nachtrag: was die Liste mit "ALLEN" Tricks angeht, die wird es niemals geben. Die Sprache C entwickelt sich ja weiter und die Liste der Tricks ist lang. Hier ist einer bei dem sich die Experten garantiert streiten würden ob er überhaupt in einer Liste stehen sollte: http://de.wikipedia.org/wiki/Duff%E2%80%99s_Device

Oder mal anders formuliert: gibt es eigentlich eine Liste mit ALLEN Tricks und Kniffen die ein Fußballprofi kann, so, daß jeder Dorfkicker die einfach lernen kann und mithalten könnte??? Wenn nein, wieso sollte das bei der Softwareentwicklung anders sein?
« Last Edit: March 05, 2013, 02:48:11 pm by Udo Klein » Logged

Check out my experiments http://blog.blinkenlight.net

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 383
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Udo: Danke für die Präzisierungen. Ich merke schon, wir reden hier von Kunst, welche bekanntlich von können kommt.  
Das ist kein Statement bezüglich Fußball...  smiley-wink

Ok, die vollständige Liste ist unmöglich. Ich konkretisiere die Frage: Gibt es eine (zwangsläufig unvollständige) Beschreibung der gängigen Methoden, Operatoren "geschickt" einzusetzen?

z.B. Hat es mich mehrere Stunden gekostet, bis ich das Bitshiften begriffen habe. Ich nehme an, man verwendet das, weil es schneller ist, als "normales" multiplizieren / dividieren(?). Wenn man es nicht gewöhnt ist, soetwas zu lesen, raucht einem schnell der Kopf, während die Schmierzettel auf dem Tisch immer voller werden - nur, um dann zu erkennen, dass es die Umschreibung einer einfachen mathematischen Funktionen ist.

Code:
int x = 1000;
int y = x >> 3;

Wenn da ein kurzer Kommentar // y = x / 8 dranstehen würde, währe es erheblich leichter nachzuvollziehen.

Oder ist das ein Anfängerproblem und jedem halbwegs erfahrenem Programmierer sofort klar, was das bedeutet?

Beste Grüße, Helmuth
« Last Edit: March 05, 2013, 03:38:50 pm by Helmuth » Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 993
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich bin ja auch noch Anfänger. Bei dem Beispiel merke ich aber das es bestimmt darauf ankommt was man gewohnt ist oder mit welchen Büchern man angefangen hat. Dieses um 3 Bit nach rechts verschieben stach mir sofort ins Auge. Weis auch nicht warum. Vielleicht weil ich sowas auch gern verwende. Eben aus Gewohnheit. Wenn man tiefer nachdenkt bedeutet es eben wie schon geschrieben 2^3 = 8, also 1000 / 8.

Eine generell bessere Code Kommentierung wäre aber schon angebracht. Nur wem sagt man das?

Ich meine, wer wirklich mit Arduino anfängt bzw. angefangen hat, dem wird es sicherlich schwer fallen gebräuchliche Schreibweisen zu erkennen. Ich nehme mich davon nicht aus. Bei Arduino ist eben alles etwas einfacher gehalten, damit jeder loslegen kann. Allerdings ist manches für mich in meinen Augen zu vereinfacht. Wenn man da jedesmal erst eine for Schleife schreiben soll für Pin Input/Output Setzung wenn es ein klarer Befehl auch macht ... dann halte ich das einfache schon wieder für umständlicher ...  smiley-grin

Zudem Thema wird es bestimmt 4 << 8;   smiley  verschiedene Meinungen geben.

Aber nicht das ihr mich falsch versteht. Obigen Code kann/konnte ich auch nicht entziffern.
« Last Edit: March 05, 2013, 03:49:18 pm by Doc_Arduino » Logged

Tschau
Doc Arduino

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Professionelle Entwickler lernen eine neue Sprache normalerweise in 1-3 Wochen. Außer es ist neuer Sprachtyp den sie nicht kennen (wechsel zwischen imperativ, Objekt orientiert, Stack orientiert, funktional, Mengen orientiert oder eine völlig neue Syntax) Für eine umfangreiche API 1/2 - 1 Jahre. Danach können die das im Halbschlaf. "Gute" Kommentare sind so eine Sache. Anfänger schreien oft nach "guten" Kommentaren, wollen aber eigentlich schlechte Kommentare. Schlechte Kommetare sagen "was" der Code macht. Gute Kommentare sagen "warum" der Code etwas macht und zeigen kritische Stellen auf. Optimalerweise ist Code so geschrieben, daß er möglichst keine Kommentare braucht.

Auf was ich raus will: im Arduino Umfeld ist der Code fast immer so einfach, daß er leichter und schneller zu lesen ist als die Kommentare. In so einem Umfeld sind Kommentare störend. Wer umbedingt die Kommentare haben will die nur wiedergeben "was" der Code macht kann sich die auch gleich von Doxygen generieren lassen.

Was "x << y" angeht: das ist nicht immer ein Shift, vor allem bei Strings nicht. Professionelle Entwickler erwarten für einen einzelnen Operator keinen Kommentar. Auch nicht für ?:

Im empfehle für solche Fragen im Zweifelsfall das Buch "Code Complete" von McConnel.
« Last Edit: March 05, 2013, 04:37:31 pm by Udo Klein » Logged

Check out my experiments http://blog.blinkenlight.net

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 383
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Udo: Habe mal diagonal reingelesen, der Schreibstil und pragmatische Ansatz sagen mir sehr zu. Wird bestellt, danke für den Tip.

Ich kann Deine Ausführungen bezüglich "gut" und "schlecht" vollumfänglich nachvollziehen. Meine Wahrnehmung ist jedoch, dass im Arduinoland deutlich mehr unerfahrene Quereinsteiger und Autodidakten unterwegs sind, als Vollblutprofis mit Erfahrung in verschiedenen Sprachen. Vielleicht täusche ich mich.
 
Manchmal würde mir ein wenig mehr Kommentar zum wie/was neben dem warum sehr hilfreich sein, da ich ein Typ bin, der sich neue Techniken zuerst mittels Beispielstudium aneignet - Grundlagenlektüre folgt später, falls eine Vertiefung aus pragmatischen Gründen nötig erscheint. An dem Punkt bin ich wohl gerade.
Logged

Pages: [1]   Go Up
Jump to: