www.mikrocontroller.net

Forum: Compiler & IDEs C - frage zu Codeschnipsel


Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich verstehe folgenden Code nicht... habe auch schon gesucht
doch in keinem tutorial habe ich eine solche schreibweise gefunden.


struct BootSec
{
  unsigned char    BS_jmpBoot[3];
  char               BS_OEMName[8];
  unsigned int     BPB_BytesPerSec; //2 bytes
  unsigned char    BPB_SecPerClus;
  unsigned int    BPB_RsvdSecCnt; //2 bytes
  unsigned char    BPB_NumFATs;
  unsigned int    BPB_RootEntCnt; //2 bytes
  unsigned int    BPB_TotSec16; //2 bytes
  unsigned char    BPB_Media;
  unsigned int    BPB_FATSz16; //2 bytes
  unsigned int    BPB_SecPerTrk; //2 bytes
  unsigned int    BPB_NumHeads; //2 bytes
  unsigned long    BPB_HiddSec; //4 bytes
  unsigned long    BPB_TotSec32; //4 bytes
};

unsigned int Root_Dir_Addr (unsigned char *Buffer)
{
  struct BootSec *bootp; //Zeiger auf Bootsektor Struktur

  bootp=(struct BootSec *)Buffer;
}

mir geht es nur um die zeile :    bootp=(struct BootSec *)Buffer;

Irgendwie werden hier die Daten aus dem buffer in die structure BootSec
geschrieben.  Doch wie genau funktioniert das... was macht das  * da am
ende...

danke schonmal im vorraus

MFG Jörn M

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

Bewertung
0 lesenswert
nicht lesenswert
.

   mir geht es nur um die zeile :

      bootp=(struct BootSec *)Buffer;

   Irgendwie werden hier die Daten aus dem buffer in
   die structure BootSec geschrieben.

   Doch wie genau funktioniert das...
   was macht das  * da am ende...


BootSec ist nur eine Strukturdeklaration, die beschreibt, wie eine
Struktur aufgebaut ist, aber keine Variable.

bootp ist hingegen ein Pointer, der auf eine Struktur vom Typ BootSec
zeigt.

Um das Konstrukt

      bootp=(struct BootSec *)Buffer;

zu verstehen, muss man sich noch den Typ der Variablen Buffer ansehen -
das ist auch nur ein Pointer, aber einer, der auf "unsigned char"
zeigt.

Das Konstrukt macht nichts weiter, als die Adresse, auf die Buffer
zeigt, in bootp einzutragen; der Ausdruck in der Klammer ist ein
sogenannter "type cast", der den Compiler instruiert, diese an sich
ungültige Zuweisung zu akzeptieren.


Literaturtip: Kernighan & Ritchie, Programmieren in C, zweite Auflage,
Hanser Verlag

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke für die Antwort..

habe erstmal bei google nach Type Cast gesucht... wenn ich das jetzt
richtig verstanden hab..

bootp=(struct BootSec *)Buffer;

Der Pointer Buffer wird in einen Pointer auf die struktur BootSec
("Strukturpointer") umgewandelt.
Danach wird dann die Adresse vom umgewandelten Pointer Buffer an den
Pointer bootp übergeben.

Ist das so richtig??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep.
Wichtig ist: Da sind nur Pointer involviert. D.h. an
den Daten selbst (da wo die Pointer hinzeigen) aendert sich
gar nichts. Die Bytes selbst werden nicht angetatscht.
Es ist lediglich so, dass Du dem Compiler mitteilst:
"Sieh mal. Ich hab da einen Haufen Bytes, Buffer ist ein Pointer
drauf. Wie Du sehen kannst ist Buffer aber ein Pointer auf
unsigned char, d.h. aus der Sicht von Buffer folgt da einfach
ein Byte auf das andere. Aber: Ueberraschung! Weil ich der
Programmierer bin, weis ich, dass da eine Struktur drinnen ist.
Die Bytes sind nicht einfach nur abfolgend, sondern sind nach
einem Plan organisiert. Der Plan dieses Aufbaus ist beschrieben
durch dir struct BootSec. Ich moechte nun von Dir, dass du den
Pointer Buffer hernimmst und so tust, als ob das ein Pointer auf
struct BootSec waere. Ich weiss das sowas normalerweise nicht
koscher ist, aber wie gesagt: Ich bin der Programmierer und
ich weiß was ich tue."

Siehst Du: das alles steckt in diesem kleinen unscheinbaren cast.
Cast's sind eine maechtige Waffe, da Du damit alle Sicherheits-
mechanismen des Compilers aushebeln kannst.

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau

Und ansonsten macht die Funktion Root_Dir_Addr überhaupt nichts, ausser
vielleicht beim compilierern eine fehlermeldung generieren, weil kein
return drinne ist.

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.