Frage zu C-Code

Gast #238026
Hi.

Ich habe gerade etwas Schwierigkeiten wieder in C reinzukommen (2 Jahre
Pause, zwischendurch Assembler, PHP, Java und SQL g). Ich programmiere
jetzt einen ATmega162 in WinAVR mit der AVR-LIBC (vorher nur Assembler)
in C. Vielleicht kann mir jemand mit meinem Code helfen:

Also ich lese ein 8-bit-Register an RAM Adresse aus und speichere es in
einer Variable. Von diesem Byte einige Informationen:

Ist das erste Bit gesetzt?
Was ergeben die letzten vier Bits?
Beispiel: 1101 1010
-> Erstes Byte gesetzt; Die letzten vier ergeben 10

Das Register wurde bereits mit define als REG benannt.

Geht das so (?):
**************************************
CHAR temp = REG;

if ( (temp>>7) == 1)
{
    panic();
}

temp = REG;
char anz = (temp & 0x0F);
**************************************

Und anschließend muss ich die nächsten anz Bytes hinter der Adresse von
RAM auch auslesen (aber nicht mehr prüfen). Gibt es da eine einfache
Möglichkeit für? Wäre ziemlich umständlich, wenn ich das so machen
müsste:
if (anz >= 1) {var1 = REG1;}
if (anz >= 2) {var1 = REG2;}
.
.
.
if (anz >= 8) {var1 = REG8;}


Danke für Eure Hilfe!
Gast
Um anz zu testen geht deine if-Konstruktion nicht. Wenn z. B. anz 4 ist,
dann würden die ersten 4 Bedingungen zutreffen. Besser:

switch (anz)
{
 case 1: ...
 break;

 case 2: ...
 break;

 default:   // wenn kein Treffer
 break;
}

MW
Gast
Hi.

Uops, das hab ich nicht ganz verständlich erklärt. Es sollen in dem
Fall die nächsten 4 Byte übernommen werden.

Es ist so, dass sich die erste RAM Zelle (REG) in einem externen Gerät
befindet und das erste Byte eine Botschfat darstellt. Die Botschaften
können aber unterschiedlich lang sein und das erste Byte enthält unter
anderem die Botschafts-Länge. Durch meine Abfrage will ich rauskriegen,
wieviele Byte ich noch einlesen muss.

Gruß, André
Gast
Beim avr-gcc ist IIRC char per default unsigned, aber das ist vom
C-Standard nicht vorgeschrieben, daher:

Bitfummeleien bitte nur bei unsigned Datentypen!

Gerade das Shiften nach rechts ist so eine Sache, denn ob das oberste
Bit (das auch das Vorzeichen kodiert) mitgeschoben werden soll oder
nicht, hängt davon ab, ob der Datentyp vorzeichenbehaftet ist, oder
nicht. Konkret sagt der Standard:

6.5.7 Bitwise shift operators
...
5 The result of E1 >> E2 is E1 right-shifted E2 bit positions.
  If E1 has an unsigned type or if E1 has a signed type and a
  nonnegative value, the value of the result is the integral
  part of the quotient of E1 / 2^E2. If E1 has a signed type and a
  negative value, the resulting value is implementation-defined.

Also auf Verständlich: shiftet man einen vorzeichenbehafteten Wert mit
gesetztem höchsten Bit nach rechts, ist das Ergebnis
implementierungsabhängig. Kann also bereits beim nächsten
Compiler-Release anders sein, sowas will man in der Regel nicht.

Ob der char jetzt per default signed oder unsigned ist, ist ebenfalls
implementierungsabhängig, bei allen anderen Ganzzahltypen ist signed
der default!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.