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 abgeschnitten

    if((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.


Anmelden zum Antworten