Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » error: width of 'VARIABLE' exceeds its type

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.01.2011, 17:28 Uhr
cmos



Hallo,

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
{
    unsigned int 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.

Grüße,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2011, 18:59 Uhr
TOSHMAX



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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.01.2011, 19:17 Uhr
0xdeadbeef
Gott
(Operator)


Vermutung: Benutz ein vorzeichenloses Literal wie

C++:
unsigned int MDREFR : 0x48000004u;


...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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.01.2011, 19:31 Uhr
ao

(Operator)


Moment, ich glaube, hier gerät was durcheinander.


C++:
struct MCRS
{
    unsigned int MDREFR : 0x48000004;
    /* ... und noch andere */
}


Das ist Bitfield-Syntax, gebräuchlich mit Feldbreiten bis max. 32 (0x48000000 ist ein bisschen hoch gegriffen).


C++:
unsigned int MDREFR : 0x48000004u;

Das kenne ich so gar nicht.


C++:
unsigned int MDREFR = 0x48000004u;

So wäre es eine Variablen-Initialisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.01.2011, 21:50 Uhr
0xdeadbeef
Gott
(Operator)


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 Dijkstra

Dieser Post wurde am 17.01.2011 um 21:50 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.01.2011, 07:26 Uhr
cmos



Guten Morgen,

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.

Grüße,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.01.2011, 08:47 Uhr
ao

(Operator)


Moin.

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.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.01.2011, 13:45 Uhr
cmos



Ja, erwischt.. ich konfiguriere da am Memorycontroller (PXA270)
Danke, werde das so mal ausprobieren, sieht elegant aus.

Danke & Grüße,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: