mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik was bedeutet diese C-Codezeile?


Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich verstehe den zweiten Teil dieser Codezeile nicht. könnt ihr mir 
sagen was die 0 da hinten bedeutet? Hab sowas noch nie gesehen.

#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )

Gruß und Danke Stefan

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0 ist der Wert dieser "Konstanten"... und der wird lediglich nach 
"unsigned portBASE_TYPE" umgewandelt (ge-casted)

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Null (0) wird auf den Datentyp unsigned portBASE_TYPE gecastet

Autor: Daniel F. (df311)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Zeile sagt dem Präprozessor, dass er jedes Vorkommen von 
"tskIDLE_PRIORITY" durch "( ( unsigned portBASE_TYPE ) 0 )" ersetzen 
soll.
Der Teil in Klammern ist nichts anderes als ein simpler Cast, der dem 
Compiler sagt, als welchen Datentyp er die 0 interpretieren soll (char, 
int, ...).

nehmen wir mal folgenden (aus der Luft gegriffenen und ziemlich 
sinnlosen) Code an:
#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )

typedef uint8_t (unsigned portBASE_TYPE);

typedef struct {
//...
unsigned portBASE_TYPE val;
//...
} TYPE_STRUCT;

// [...]

TYPE_STRUCT xyz.val = tskIDLE_PRIORITY;

nach dem Durchlauf des Präprozessors sieht das ganze dann in etwa so 
aus:
// wie oben

TYPE_STRUCT xyz.val = ( ( unsigned portBASE_TYPE ) 0 );

Wobei man die äuseren Klammern nach dem "=" auch weglassen könnte (im 
#define).
Das ganze ist also nichts anderes als "Faulheit" des Programmieres, der 
nicht immer (...) schreiben möchte, sondern einfach tskIDLE_PRIORITY und 
dabei auch noch die Lesbarkeit des Codes deutlich erhöht.

EDIT:
Verdammt zu langsam oder zu viel geschrieben...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kanzler Gorkon wrote:
> Die Null (0) wird auf den Datentyp unsigned portBASE_TYPE gecastet

Was aber nicht erlaubt ist.

Man darf keine standard Typbezeichner auf eigene Typbezeichner anwenden!

Das geht hier wohl nur deshalb gut, weil "portBASE_TYPE" kein echter 
Typbezeichner ist sondern auch wieder nur ein Macro.

Das "unsigned" ist hier also Quatsch.


Peter

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah vielen Dank euch allen! Jetzt isses klar.

@Daniel: Warst zwar langsamer, aber hats mir nochmal sehr verdeutlicht! 
THNX!!!

Gruß und noch nen schönen Abend!

Stefan

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum machen wir den CAST?

Wir sagen dem Compiler damit nur, dass wir genau wissen was wir tun.
Dann präsentiert uns der Compiler keine Warnungen. Nur darum.

Z.B.
char c;
short s;
:
: 
c = s;
:
--> Compilerwarnung: in c passt weniger als in s.
                     s wird abgeschnitten.
char c;
short s;
:
: 
c = (char)s;
:
--> keine Warnung, denn wir haben dem Compiler gesagt:
    Er soll doch bitte s wie einen char behandeln.
    Wir wissen selber, dass in c weniger passt als in s.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Danegger

Das
:
#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )
:
kommt aus so einer Define-eritis, wo aus einem char ein BYTE (alternativ 
portBASE_TYPE) und daraus ein unsigned BYTE (oder auch unsigned 
portBASE_TYPE) wird, und zum Schluss kann das keiner mehr lesen.

Ich jedenfalls krieg da immer gleich die Krätze am Auge,
wenn ich sowas sehe ;-)

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.