Befehl unklar
-
Hallo Freunde
habe in einem Programm die vollgenden Zeilen gefunden. Sind mir aber voll kommen unklar. Verstehe es einfach nicht. Dies Befehle stehen am Anfang des Programmes. Auf welche Variable bezieht es sich oder was wird damitumgerechnet?
Welche Teile vom Prg sind noch dazu nötig? Alles unklar. Kann auch nicht vervollgen wo es noch genutzt wird. Kann es mir jemand erklären.#define LOBYTE(x) (uint8_t)((uint16_t)x)
#define HIBYTE(x) (uint8_t)(((uint16_t)x)>>8)
#define MAKE_WORD(hi,lo) ((hi*0x100)+lo)Danke für Eure Hilfe.
Achim
-
Das sind bloß Makros, die aus einem (scheinbar) 16 bit Wort die oben bzw. unteren 8 Bit extrahieren sollen (HIBYTE bzw. LOBYTE). MAKE_WORD macht ungefähr das Gegenteil, baut zwei Bytes zu einem 16 Bit Wort zusammen.
-
achim S. schrieb:
Sind mir aber voll kommen unklar. Verstehe es einfach nicht.
http://www.c-plusplus.net/cms/modules.php?op=modload&name=mbBooks&func=db&theme=c&sortby=title
-
Welcher Name hat denn ads Wort mit 16B und in welche wird es geschrieben?. Makros ok. Doese müssen doch im programm aufgerufen werden. Das gleich ist doch beim Zusammenbau. Welche auf was. Da mitten im Prg diese Lo und Hi auhgerufen wird, muss ich doch werte an die Variablen übergeben und anschliessend weiter verarbeiten. In dem Prg waraus diese Zeilen stammen wird recht oft es gemacht. Mir als Anfänger gelingt dadurch der Durchblick nicht mehr
char c1=val/16; // ????
char c2=val%16; // ????
if (c1<10) c1+='0'; else c1+='a'-10; // ?????
if (c2<10) c2+='0'; else c2+='a'-10; // ?????
gfx_print_char(c1); // ?????
gfx_print_char(c2); // ????
}void print_hex12 (uint16_t val) // ????
{
char c0=val/256; // ????
val %= 256;
char c1=val/16;
char c2=val%16;
if (c0<10) c0+='0'; else c0+='a'-10; // ????
if (c1<10) c1+='0'; else c1+='a'-10;
if (c2<10) c2+='0'; else c2+='a'-10;
Das gleiche gilt auch für diese Zeilen. Der Autor mag solche Zeilen besonders gern. In jedem seiner Prg steht sowas. Auch diese Zeilen stammen aus dem gleich wie die anderen.
Danke für den Literatur Tip. Da bin ich dran. Doch ihr im Forum sagt doch selber, das auf Fragen geantwortet wird. Jeder hat eine andere Art zu programmieren. Als anfänger ist es nicht so leicht diese Sachen zu begreiffen. Da das Prg ohne jeden Kommentar ist, bleibt einen nur die Möglichkeit zu fragen.
Achim
-
Man könnte aus dem Funktionsnamen schon schließen, dass da eine Zahl in hexadezimaler Form ausgegeben wird.
Ist es wirklich so, dass dir zu jeder einzelnen Zeile nur Fragezeichen einfallen? Mit welcher Motivation stürzt du dich denn in solche Programme? Ich hab wenig Lust, jedes Komma zu erklären, stell doch mal konkrete Fragen.
-
Hallo Bashar
Danke für deine Zeilen.
Mit den ? kennzeichne ich Zeilen die mir unklar sind. Von den 2 Seiten Code ist das der Rest. Da hierbei eine starke Umrechnung in Hexa vorgenommen wird und das wahrscheinlich über solche Sachen, versuche ich den sinn zu verstehen. Eine Eigenart bei der Sache ist auch die Abfrage von Ports und das setzen von Ports. Es geht natürlich. Habe aber in einigen Bereichen die Antwort gefunden, das das einen alter Programmierart ist. Manche sagen auch , so was wird gemacht um Anfängern nichts zu zeigen. Ich ahbe andere Prg gefunden vom gleichen Autor wo solche Abfragen nicht drin sind. Dadurch kann ich den Sachen vollgen und begreife es. Da ja bei der Prg jedes Kpmma und Punkt wichtig ist muss ich mich an einen bestimmten ablauf halten. Daher versuche ich es zu begreifen. Warum soll man nicht lernen von andern die es besser können aber ihr wissen ungern teílen. Du möchtest konkrete Fragen. Kein Problem. Due Variable c1 und c2 wird mit if und else verglichen. Damit kannich an dieser Stelle nichts anfangen. Da der Code sehr eng geschrieben ist, so alles in eine Zeile ist die ganze sache unübersichtlich. Und wie erfolgt die Umrechnung von Lo und H Bit und die Zusammenführung. Habe schon einiges an Bücher gewälst doch ohne Ergebnis.
Achim
-
Da soll also val in Hex-Form ausgegeben werden. Die (obere) Funktion geht davon aus, dass val sich in 2 Hex-Ziffern darstellen lässt, also zwischen 0 und 255 (= 0xFF) liegt.
Wenn das so ist, zerlegt man val folgendermaßen in zwei Zahlen c1, c2 zwischen 0 und 15: val = 16*c1 + c2 (gleiches Prinzip wie wenn man z.B. im Dezimalsystem 43 als 10*4 + 3 darstellt). Jetzt muss man nur noch die Werte 0 bis 9 von c1 bzw. c2 auf die Ziffer '0' bis '9' abbilden sowie die Werte 10 bis 15 auf 'a' bis 'f'.Dabei macht man sich zunutze, dass die Ziffern in jedem Zeichensatz in der Reihenfolge '0', '1', ..., '9' aufeinanderfolgen, man kann also die einer Zahl (zwischen 0 und 9) zugeordnete Ziffer finden, indem man diese Zahl auf '0' addiert.
Beispiel: z=5, '0'+z == '5'.
Für die Hex-Ziffern 'a' bis 'f' gibt es strenggenommen keine Garantie, dass sie im Zeichensatz aufeinanderfolgen, aber im ASCII-Zeichensatz und damit praktisch immer ist das so. Gleiches Prinzip, aber vorher noch 10 abziehen: z=14, 'a'+z-10 = 'a'+4 = 'e'.
Die nächste Funktion print_hex12 funktioniert für 12-Bit-Zahlen (also 0 bis 4095 = 0xFFF) statt nur 8-Bit, funktioniert aber ansonsten genauso.
-
Hallo
erst einmal danke für deine antwort. Jetzt kann ich was damit anfangen und gezielt weiter machen. Bleibt eigentlich nur noch die Frage - warum. Ist es nötig Zahlen in dieser art umzurechen. Der Prozessor arbeitet doch auch mit hex. Im ist es doch im Grunde gleich. Eine Ausgabe im Display kann ich doch auch einfacher darstellen. Kann also nur schluss draus ziehen- für Anfänger nicht geeignet oder besser gesagt es geht auch einfacher. Danke
Achim
-
achim S. schrieb:
Ist es nötig Zahlen in dieser art umzurechen. Der Prozessor arbeitet doch auch mit hex.
Nö, das ist nicht nötig, deshalb wird es auch nicht so gemacht. Der Compiler erkennt (hoffentlich) die Division durch 16 und ersetzt sie durch entsprechende bitweise Operationen. Man kann das auch direkt schreiben, wenn man will (und man sieht das auch sehr oft):
char c1 = val >> 4; char c2 = val & 0x0F;
Aber ob das "für Anfänger geeigneter" wäre?
Das danach kann man in der Tat einfacher schreiben:
static const char hexDigits[] = { '0', '1', /* ... */, 'e', 'f' }; /* ... */ c1 = hexDigits[c1]; c2 = hexDigits[c2];
Macht man aber nicht, weil das andere auch nicht so schrecklich kompliziert ist, wie es für dich vielleicht aussieht.
-
Hallo
Du bist ja wirklich schnell. Habe gleich mir deine Sachen angesehen. Muss noch ein bisschen weiterfragen.
Ich habe doch in C++ die Möglichkeit Tahle von Hex in Dezi und von Dezi in Hex zu wandeln. Wenn ich einen Wert ausgeben möchte z.B. ein Stand, Entfernung, Messwert oder ähnlich, nützt mir doch Hex wenig. MiT Dezi bekomme ich einen klaren wert angezeigt. Ob ich im Hintergrund mit Hex oder Dezi weiterrechne ist doch im Grunde gleich. Naja eines geht besser. Wenn ich die Zahlen zerlege muss oder kann ich sie an andrer Stelle nutzen. Bei der Ausgabe erscheinen sehr viele Hex-. Meistens 4 Stellig. Dabei sind die ersten 2 meistens 0 und die anderen ändern stark den Wert. Bleibt wieder die Frage wozu?
Achim
-
Zahlen werden im Computer fast immer(*) im Binärsystem abgespeichert und verarbeitet. Nur die Aus- und Eingabe erfolgt in der Regel im Dezimalsystem. Oder halt im Hexadezimalsystem.
Hexadezimal ist eigentlich nur eine kompakte Darstellung des Binärsystems, immer 4 Binärstellen bilden zusammen eine Hex-Stelle. Deshalb eignet es sich für alle Größen, die eine enge Beziehung zum Binärsystem haben, besonders Speicheradressen und sowas, da ist das Dezimalsystem unhandlich.[(*) es gibt auch vereinzelt binär codierte Dezimaldarstellungen für z.B. Geldbeträge]
-
Danke dir noch mal für deine Antwort. Habe mir die Sache angesehen und versucht zu verstehen. Nur noch eine Sache. Hatte ja versucht im Netz auch antworten zu finden. Kaum was gefunden. Gibt es eine Bezeichung oder Begriff für diese Art mit der ich auch im Netz suchen Kann?
Achim