www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik #defines innerhalb funktionen definieren


Autor: newbieNoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main (void)
{
#define main_VAR1_BIT1 0x01
#define main_VAR1_BIT2 0x02
#define main_VAR1_BIT3 0x04
...
unsigned char Var1 = 0;

...
if(Var1 & main_VAR1_BIT2) 
  ;//tu was
}

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

lg
niebNoob

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: newbieNoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: newbieNoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Vollständigkeit halber, da fehlte noch was:
So ists richtig!
typedef struct
{
  int bit1 : 1;
  int bit2 : 1;
  int bits_rest : 6;
} einByte;

einByte is_aByte;

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas nennt man Bitfeld.

Autor: ... ... (docean) Benutzerseite
Datum:

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

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

zu schreiben...

und ja Bitfelder sollte man vermeiden...

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

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

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: newbieNoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool danke fuer die antworten,...

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

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

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
newbieNoob wrote:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

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.