PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Plattformunabhängige Typdefinitionen für Gleitpunktwerte?



nobody0
03-02-2004, 22:57
Weil insbesondere Compiler für Microcontroller sich häufig nicht an Standards wie ANSI-C oder IEEE754 halten, habe ich mir ein Header-File mit defines für Ganzzahlen geschrieben:

# if defined(__alpha__) || defined(__arm__) || defined(__armv4l__) \
|| defined(__i386__) || defined(__i486__) || defined(__i586__) \
|| defined(__i686__) || defined(__ia64__) || defined(__m68k__) \
|| defined(__mips__) || defined(__ppc__) || defined(__sparc__)
# ifndef u8
# ifdef __u8 // __u8 in user space, u8 in kernel space
# define u8 __u8 // define u8 also in user space
# else
# define u8 unsigned char
# endif
# endif
...

# if defined(__msp430__)
# ifndef u8
# ifdef __u8 // __u8 in user space, u8 in kernel space
# define u8 __u8 // define u8 also in user space
# else
# define u8 unsigned char
# endif
# endif
...

Aber mir fehlt das entsprechende noch für Gleitpunktzahlen und komplexe Zalen nach ANSI-C u. IEEE754, d. h. sizeof(float) = 4, sizeof(double) = 8, sizeof(long double) = 10, usw..
Wie bekomme ich diese defines hin? :confused:

peschmae
04-02-2004, 07:41
Das dürfte wohl nicht so einfach werden, weil sicherlich auch noch die Grösse von Basis/Exponent unterschiedlich sein kann - es reicht also wohl nicht, wenn du die Grösse der gesamten Variablen angibts.

MfG Peschmä

wraith
04-02-2004, 09:52
Entweder du hast ein Handbuch für deinen Mikrocontroller oder für deinen Compiler.
Wenn da nicht drinsteht,welche Datentypen der versteht,helfen auch keine #defines weiter.
Und gerade bei Floatingpoint sehe ich schwarz,ist nicht gerade so verbreitet unter Mikrocontrollern (vielleicht aber in denen,die du verwendest).

Btw,das hier ist ganz böse:


# define u8 __u8 // define u8 also in user space

Der Präprozessor ist dumm,und kennt meist keine C++ Kommentare,außerdem hast du ja sowieso was von C geschrieben.
Also in PP Direktiven immer C Kommentare.

nobody0
04-02-2004, 11:09
Original geschrieben von wraith

Btw,das hier ist ganz böse:


# define u8 __u8 // define u8 also in user space

Der Präprozessor ist dumm,und kennt meist keine C++ Kommentare,außerdem hast du ja sowieso was von C geschrieben.


Das war nur bis ANSI-/ISO-C 90 so; ab ANSI-/ISO-C 99 ist auch // ein Kommetarzeichen. Bisher habe ich noch keinen Compiler gesehen, der // nicht als Kommentarzeichen interpretiert.

@peschmae:
Nach IEEE754 ist es eindeutig (bis auf die Endianess), denn deshalb gibt es den Standard. Die (weitestgehende) Eindeutigkeit ist ja gerade der Sinn von Standards.

Notfalls muss ich Tests auf ANSI-C- + IEEE754-Konformität einbauen (mit #if sizeof float != 4 #error "Type float is not IEEE754 complient because sizeof float !=4" u. a.).

wraith
04-02-2004, 11:21
Original geschrieben von nobody0
Das war nur bis ANSI-/ISO-C 90 so; ab ANSI-/ISO-C 99 ist auch // ein Kommetarzeichen.

Das mußt du mir nicht sagen,aber was sollte dann der Kommentar?


Weil insbesondere Compiler für Microcontroller sich häufig nicht an Standards wie ANSI-C oder IEEE754 halten.

Also entweder dein Mikrocontrollercompiler hält sich an den aktuellen C Standard oder nicht.


Bisher habe ich noch keinen Compiler gesehen, der // nicht als Kommentarzeichen interpretiert.

gcc -W -Wall -ansi -pedantic
;).

Außerdem geht es hier um den PP nicht um den Compiler.