Forum: Mikrocontroller und Digitale Elektronik #defines innerhalb funktionen definieren


von newbieNoob (Gast)


Lesenswert?

Hi,
ich frage mich gerade ob ich ein #define auch in einer Funktion 
schreiben kann.
Wird dass dann richtig übersetzt, ist ja ein Präprozessorbefehl, der 
eigentlich nix mit dem Programmablauf zu tun hat.

Grund:
Ich möchte char in seine Bits unterteilen.
Auf die Art des Typedef will ich aber verzichten, da das ja nicht in 
Ansi C standardisiert ist und bei einem Controllerwechsel problematisch 
werden könnte.

Meine idee:
1
void main (void)
2
{
3
#define main_VAR1_BIT1 0x01
4
#define main_VAR1_BIT2 0x02
5
#define main_VAR1_BIT3 0x04
6
...
7
unsigned char Var1 = 0;
8
9
...
10
if(Var1 & main_VAR1_BIT2) 
11
  ;//tu was
12
}

Spricht was dagegen #defines innerhalb von Funktionen zu definieren??

lg
niebNoob

von Timmo H. (masterfx)


Lesenswert?

Prinzipiell kannst du es natürlich machen. Was für mich dagegen sprechen 
würde, wäre dass der Code eben schnell unübersichtlich wird.
Macros oder defines gehören für mich immer an den Anfang oder eben in 
eine entsprechende Header-Datei, alles andere stiftet nur verwirrung.
Du könntest es ja auch mit Bitfeldern machen!
Was genau meinst du "Auf die Art des Typedef will ich aber verzichten", 
ich weiß jetzt gerade nicht welches du meinst

von newbieNoob (Gast)


Lesenswert?

Danke für den tipp,...

Ich meinte sowas:

[c]
typedef
{
  int bit1 : 1;
  int bit2 : 1;
  int bits_rest : 6;
} einByte;

einByte is_aByte;

void main (void)
{
...
if(is_aByte.bit1 == 1)
  ; //tu was
}

Hier ist jetzt das problem, dass dieser Typedef nun Compilerabhängig mal 
von oben nach un´ten oder umgekehrt abgearbeitet wird.


Aber ich glaub dann belass ichs bei den Hexzahlen,...

Gruß

von newbieNoob (Gast)


Lesenswert?

Der Vollständigkeit halber, da fehlte noch was:
So ists richtig!
1
typedef struct
2
{
3
  int bit1 : 1;
4
  int bit2 : 1;
5
  int bits_rest : 6;
6
} einByte;
7
8
einByte is_aByte;
9
10
void main (void)
11
{
12
...
13
if(is_aByte.bit1 == 1)
14
  ; //tu was
15
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sowas nennt man Bitfeld.

von ... .. (docean) Benutzerseite


Lesenswert?

die #defines sind dann aber in der gazen datei gültig... nicht nur in 
der fkt.

und es reicht
1
if(is_aByte.bit1)
2
  //tu was

zu schreiben...

und ja Bitfelder sollte man vermeiden...

ich schreib meistens
1
if(is_aByte & (1<<4))
2
  //tu was

so ist wenigstens zu sehen was gemeint ist (hier das 4. Bit von 0 
anfangen zu zählen)

von eProfi (Gast)


Lesenswert?

Ich würde gleich noch das Bit so benennen, welche Funktion es inne hat:
z.B.
#define Vorzeichen 4

if(is_aByte & (1<<Vorzeichen))
  //tu was


Wenn z.B. bei einem if  der Vergleich weggelassen wird, hat das immer 
die Bedeutung von  !=0 , also wenn xyz ungleich Null.

von newbieNoob (Gast)


Lesenswert?

Cool danke fuer die antworten,...

ich mag mich irren, aber mit dem
1
if(is_aByte & (1<<4))
2
  //tu was

gibts ja noch nen weiteren schiebebefehl,...
mehr (Assembler-)code zu bearbeiten als bei
1
if(is_aByte & 0x04)
2
  //tu was

Ich glaub ich bleib bei der Hex Methode (ohne define)
Gruß und merci,...
newbnoob

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

newbieNoob wrote:

> ich frage mich gerade ob ich ein #define auch in einer Funktion
> schreiben kann.

Ja, natürlich.  Wenn du das schon tust, solltest du aber aus
Gründen der Übersichtlichkeit und zur Fehlervermeidung am Ende
der Funktion noch die zugehörigen #undef-Anweisungen spendieren.

von Stefan E. (sternst)


Lesenswert?

newbieNoob wrote:

> ich mag mich irren, aber mit dem
1
if(is_aByte & (1<<4))
2
  //tu was
>
> gibts ja noch nen weiteren schiebebefehl,...
> mehr (Assembler-)code zu bearbeiten als bei
1
if(is_aByte & 0x04)
2
  //tu was

Nein, (1<<4) ist eine Konstante, die schon beim Compilieren berechnet 
wird. Der Assemblercode ist in beiden Fällen identisch(*).

(*) Nun, natürlich nicht 100%ig identisch, denn (1<<4) ist nicht 0x04, 
sondern 0x10.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>mehr (Assembler-)code zu bearbeiten als bei....

Da hätte ich noch diesen hier:
Und schreibt bloß nicht so viele Kommentare in den Sourcecode.
Die machen das Programm so unerträglich langsam ;-)

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.