ich bekomme eine Fehlermeldung dich ich bisher noch nie gesehen habe. Ich programmiere gerade unter Linux mit C. Ich habe eine Struktur in der ich die Adressen für Register abgelegt habe.
C++:
struct MCRS { unsignedint MDREFR : 0x48000004; /* ... und noch andere */ }
Ich erhalte immer Fehlmeldungen beim Compilieren die da lauten, error: width of 'MDREFR' exceeds its type.
Was genau bedeutet das ? Das gleiche passiert auch, wenn ich eine Struktur über typedef Anlege. Schreibe ich aber anstatt des Hex-Wertes z.b. eine 10 dahinter kommen keine Fehler beim Komppilieren. Aber der Hex-Wert ist nicht größer als 32bit.
Doch ist er, und zwar aus dem einfachen Grund, dass nicht ein Limit erwartet wird, sondern die Anzahl an Bits die der Typ einnimmt. Eine Möglichkeit einem int ein Maximum zuzuweisen ist mir noch nicht bekannt, also musst du dich wohl mit 31-bit begnügen.
...allerdings sollte das eigentlich erst problematisch werden, wenn das höchste Bit gesetzt ist, also jenseits von 0x80000000. sizeof(int) ist >= 4? -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
Wobei man die in C, wo ich mir das grad nochmal ansehe, auch nicht auf diese Weise schreiben könnte.
Ist vielleicht
C++:
enum MCRS { MDREFR = 0x48000004 };
gemeint? -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe DijkstraDieser Post wurde am 17.01.2011 um 21:50 Uhr von 0xdeadbeef editiert.
das mit dem Bitfield kam mir dir Nacht auch durch den Sinn. Enums hatte ich vorher probiert, dann dürfen aber Variablen nicht mehr so genannt werden, deshalb der Versuch über die Struktur.
Danke erstmal, ich werde das mit dem "u" mal probieren.
Nach kurzem Googlen hab ich jetzt eine Ahnung, was das werden soll: Du programmierst den Memorycontroller von einem Intel-PXA-Prozessor (älteres PDA-Modell).
Ich zieh solche Sachen gerne so auf:
C++:
// Standard-Integer-Typen laden: // Die Größe von unsigned int ist plattformabhängig, // die Größe von uint32_t nicht. #include <stdint.h>
// Das Register-Layout definieren. // Volatile kann wichtig sein, damit der Compiler // die Zugriffe exakt so macht wie beschrieben. struct MCRS { volatile uint32_t MDCNFG; volatile uint32_t MDREFR; volatile uint32_t MSC0; // usw. };
// Anwendung // ---------
// Einen Strukturpointer deklarieren und // auf die Basisadresse biegen. struct MCRS * mcrs = (MCRS *) 0x48000000;
// Über den Pointer auf die Strukturmember zugreifen mcrs->MDCNFG = 0xfee1600d; mcrs->MDREFR = 0xdeadbeef; // usw.