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
. 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
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??
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.