Forum: Compiler & IDEs C - frage zu Codeschnipsel


von Jörn (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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

von Jörn (Gast)


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??

von Karl H. (kbuchegg)


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.

von Christian Schifferle (Gast)


Lesenswert?

Genau

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.