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


von Unknown (Gast)


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 User
von Peter II (Gast)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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)


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)


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)


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)


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)


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 User
von Unknown (Gast)


Lesenswert?

Vielen Dank für die Infos!

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.