Was ist casten
-
Was ist casten?
int a;
int b;
int c;
int *pionter;pointer = (int*) &a;
pointer zeigt auf a;
pointer++;
pointer zeigt auf b;
pointer++;
pointer zeigt auf c;Ist das so richtig????
oder:Folgendes Beispiel:
buffer = (unsigned char *)&TXB0D0;TXB0D0 ein 8Bit Register eines Microcontrollers, es folgen TXB0D1,....,TXB0D7.
Ich übergebe der Funktion einen Zeiger auf einen 8 Byte langen String,
der anschliessend in die Register TXB0D0- TXB0D7 kopiert werden soll.
buffer ist als unsigned char Pointer declariert, warum muß ich "casten" wenn
ich den Pointer auf TXB0D0 setzen möchte, habe vorher Assembler programmiert
und es kommt mir deshalb vieleicht etwas komisch vor.
-
hermes schrieb:
Was ist casten?
int a;
int b;
int c;
int *pionter;pointer = (int*) &a;
pointer zeigt auf a;
pointer++;
pointer zeigt auf b;
pointer++;
pointer zeigt auf c;Der erste Cast ist unnoetig, es haette gereicht dem pointer die Adresse
von 'a' zuzuweisen. Die darauffolgenden Anweisungen sind sehr gefaehrlich,
denn dein Zeiger wird mit grosser Wahrscheinlichkeit _nicht_ auf b und dann
auf c zeigen. Das waere reiner Zufall, denn dir ist nicht garantiert, dass
die Variablen im Speicher hintereinander liegen.oder:
Folgendes Beispiel:
buffer = (unsigned char *)&TXB0D0;TXB0D0 ein 8Bit Register eines Microcontrollers, es folgen TXB0D1,....,TXB0D7.
Ich übergebe der Funktion einen Zeiger auf einen 8 Byte langen String,
der anschliessend in die Register TXB0D0- TXB0D7 kopiert werden soll.
buffer ist als unsigned char Pointer declariert, warum muß ich "casten" wenn
ich den Pointer auf TXB0D0 setzen möchte, habe vorher Assembler programmiert
und es kommt mir deshalb vieleicht etwas komisch vor.Du willst die Inhalte der Register als eine Zeichenkette interpretieren,
daher ist der Cast nach (unsigned char*) hier wohl gewuenscht.mfg
v R
-
hermes schrieb:
Was ist casten?
Das umwandeln des Typs einer Variable in einen anderen Typ. Z.B.
double a = -4.3;
int b = a; // b == -4; impliziter cast, Nachkommateil wird abgeschnittenif((unsigned int)b ==
... // explizieter cast
int a;
int b;
int c;
int *pionter;pointer = (int*) &a; // (int*) überflüssig, hier wird gar nix gecastet
pointer zeigt auf a;
pointer++;
pointer zeigt auf b;
pointer++;
pointer zeigt auf c;Ist das so richtig????
Nö. es ist nirgendwo garantiert, dass Variabeln, die hintereinander
deklariert werden, auch hintereinander im Speicher liegen. Könnten auch
anders herum im Speicher liegen. Oder völlig willkürlich verteilt. Das geht
nur bei arrays.oder:
Folgendes Beispiel:
buffer = (unsigned char *)&TXB0D0;TXB0D0 ein 8Bit Register eines Microcontrollers, es folgen TXB0D1,....,TXB0D7.
Ich übergebe der Funktion einen Zeiger auf einen 8 Byte langen String,
der anschliessend in die Register TXB0D0- TXB0D7 kopiert werden soll.
buffer ist als unsigned char Pointer declariert, warum muß ich "casten" wenn
ich den Pointer auf TXB0D0 setzen möchte, habe vorher Assembler programmiert
und es kommt mir deshalb vieleicht etwas komisch vor.Welchen Typ hat TXB0D0 ?
-
hermes schrieb:
Was ist casten?
Eine explizite Typumwandlung.
int a;
int b;
int c;
int *pionter;pointer = (int*) &a;
pointer zeigt auf a;Soweit richtig, aber das kannst du auch einfacher haben:
poiner = &a;
&a ist bereits ein Pointer auf int (weil a ein int ist), muss also nicht weiter gecastet werden.
pointer++;
pointer zeigt auf b;Falsch. Der Pointer zeigt auf die Position nach a. Was genau dort liegt, ist nicht festgelegt. Selbst wenn dein Compiler so arbeitet, dass b dort liegt, ist es ausgesprochen mieser Stil, sich darauf zu verlassen. Wenn du Variablen (gleichen Typs) willst, die im Speicher direkt hintereinander liegen, musst du mit Arrays arbeiten.
Folgendes Beispiel:
buffer = (unsigned char *)&TXB0D0;TXB0D0 ein 8Bit Register eines Microcontrollers, es folgen TXB0D1,....,TXB0D7.
Ich übergebe der Funktion einen Zeiger auf einen 8 Byte langen String,
der anschliessend in die Register TXB0D0- TXB0D7 kopiert werden soll.
buffer ist als unsigned char Pointer declariert, warum muß ich "casten" wenn
ich den Pointer auf TXB0D0 setzen möchte, habe vorher Assembler programmiert
und es kommt mir deshalb vieleicht etwas komisch vor.Wenn TXB0D0 einen Typ hat, der sich von unsigned char unterscheidet, kannst du buffer nicht direkt drauf zeigen lassen. Ein Zeiger kann immer nur auf Daten von "seinem" Typ zeigen (also int* auf int, char** auf char* usw.). Weißt du aber aus irgendeinem Grund besser als der Compiler, kannst du ihn durch einen Cast zwingen, buffer die Adresse von TXB0D0 zuzuweisen.