Forum: Mikrocontroller und Digitale Elektronik Hilfe zu C-Syntag benötigt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Unknown (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

hab hier einen Ausschnitt aus einem Code und verstehe diesen nicht 
richtig.

In einem Headerfile steht folgendes.
1
typedef unsigned char  *pu8;
2
volatile unsigned char DDRA          @0x02;
3
4
Jetzt kommts. In einem .C-file steht folgendes.
5
6
static const pu8 DataDirection [MAX] =
7
{#if ...
8
    (pu8)(&DDRA),
9
 #endif 
10
...}
Irgendwie verwirrt mich der Ausdruck "(pu8)(&DDRA)".
Kann mir das jmd kurz erklären?

Gruß

: Bearbeitet durch Moderator
von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:
> Irgendwie verwirrt mich der Ausdruck "(pu8)(&DDRA)".
> Kann mir das jmd kurz erklären?

ich würde sagen ein normaler typecast.

(int)(a)

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:
> Kann mir das jmd kurz erklären?
Hier wird die Adresse vom DDRA genommen (&DDRA) und auf einen "unsigned 
char" Pointer gecastet.

von Unknown (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal.
Glaub ich steh aber noch immer auf der Leitung:

aber wieso ist dieser Typecast nötig? DDRA ist ja auch unsingned char 
variable.

warum reicht es nicht:

static const pu8 DataDirection [MAX] =
{#if ...
    &DDRA,
 #endif
...}

von Dennis S. (eltio)


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:
> aber wieso ist dieser Typecast nötig? DDRA ist ja auch unsingned char
> variable.

Wieso "auch"? pu8 ist ein Zeiger (Sternchen nicht übersehen)!

Gruß

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:

> aber wieso ist dieser Typecast nötig? DDRA ist ja auch unsingned char
> variable.


und die ist, nicht zu vergessen, auch volatile!

Da wird der Autor sowieso noch viel Spass mit lustigen Fehlern haben, 
dadurch dass er sich dieses volatile weggecastet hat.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:
> hab hier einen Ausschnitt aus einem Code

Ausschnitte sind immer ne ganz schlechte Idee.
Laß die Deppen vom Forum doch ruhig raten, wozu das sein könnte, die 
haben ja sonst nichts besseres zu tun.

von Unknown (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Unknown schrieb:
>> hab hier einen Ausschnitt aus einem Code
>
> Ausschnitte sind immer ne ganz schlechte Idee.
> Laß die Deppen vom Forum doch ruhig raten, wozu das sein könnte, die
> haben ja sonst nichts besseres zu tun.


dass hier immer gleich schwache Kommentare kommen..
Es ging hier nur zum Verstehen der Syntax, da ist der gezeigte Code 
vollkommen ausreichend.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Unknown schrieb:
> Peter Dannegger schrieb:
>> Unknown schrieb:
>>> hab hier einen Ausschnitt aus einem Code
>>
>> Ausschnitte sind immer ne ganz schlechte Idee.
>> Laß die Deppen vom Forum doch ruhig raten, wozu das sein könnte, die
>> haben ja sonst nichts besseres zu tun.
>
>
> dass hier immer gleich schwache Kommentare kommen..
> Es ging hier nur zum Verstehen der Syntax, da ist der gezeigte Code
> vollkommen ausreichend.

Dann muss ich dir attestieren, dass du ein C-Buch brauchst, wenn du 
einen Cast nicht erkennst, wenn du einen siehst.
Mehr lässt sich dann aus dieser Fragestellung nicht ableiten.

Syntax ist eine Sache. Aber Syntax ist nicht alles. Denn die 
tieferliegende Frage nach dem "Warum?" oder dem "Was wird bezweckt" 
lässt sich nicht beantworten.

Du fragst ja selber
> aber wieso ist dieser Typecast nötig?


der Cast wurde höchst wahrscheinlich eingeführt, um die Warnung vom 
Compiler zu unterdrücken, dass hier ein volatile implizit verloren geht. 
Durch den Cast sagt der Programmierer dem Compiler "Halts Maul"
Die eigentliche Frage ist aber: War das eine gute Idee? Wer von den 
beiden hat eigentlich recht? Der Programmierer oder der Compiler? Ist 
das wegcasten des volatile eine gute und harmlose Idee, oder hatte der 
Compiler recht, als er die Warnung ausgesprochen hat?
Ohne verwendenden Code lässt sich das nicht entscheiden. Im Zweifelsfall 
plädiere ich für "Der Compiler hatte recht und der Programmierer wird zu 
5 Stunden debuggen ohne Bewährung bei verschärften Optimizerbedingungen 
verurteilt".
Das wegcasten von 'const' oder 'volatile' ist selten eine gute Idee. 
Compiler warnen nicht ohne Grund vor derartigen impliziten Operationen. 
Dann gibt es eben 2 Möglichkeiten. Entweder man stellt den Compiler mit 
einem explizitem Cast und einem "Kusch, ich bin der Herr im Haus" ruhig. 
Oder die Sache ist schwerwiegender und ein paar Datentypen müssen 
angepasst werden.

: Bearbeitet durch Moderator
von Unknown (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Infos!

Gruß

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]
  • [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.