amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Typfrage [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.06.2006, 22:38 Uhr

Reth
Posts: 1858
Nutzer
Hallo zusammen,

wie bekomm ich denn den Datentyp für so Flags wie MENUENABLED raus (ist mit 0x0001 definiert)?

Ist das unsigned int?

Ciao

[ - Antworten - Zitieren - Direktlink - ]

21.06.2006, 23:28 Uhr

whose
Posts: 2156
Nutzer
@Reth:

Öhm... nicht erschlagen, falls das jetzt Unsinn sein sollte (habe mir da nie wirklich Gedanken drüber gemacht), aber sind die Flags per se nicht typlos? Es sind ja nur #define s...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 08:07 Uhr

Reth
Posts: 1858
Nutzer
@whose:

Ja sie sind typlos definiert (#defines), aber bin ja auch dümmlich, hätt nur z.B. in der struct NewMenu nachsehen müssen, dort werden sie als UWORD angegeben!

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 09:32 Uhr

Solar
Posts: 3680
Nutzer
Nein, #define's sind nicht typenlos, zumindest nicht in dem Moment in dem sie vom Präprozessor in den Quellcode eingefügt werden. In dem Moment sind das Integer-Literale, somit vom Typ int sofern nicht anders angegeben. Wenn Sourcen den Typ als ULONG angeben, ist das eine implizite Typumwandlung.

#define 42 -> int
#define 42u -> unsigned int
#define 42l -> long
#define 42ul -> unsigned long

[ Dieser Beitrag wurde von Solar am 23.06.2006 um 10:14 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 09:43 Uhr

Reth
Posts: 1858
Nutzer
@Solar:

Dann wird in der Amiga API wohl an der Stelle implizit gewandelt, da
MENUENABLED ja als 0x0001 definiert ist und in struct NewMenu UWORD (unsigned short?) steht.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 10:38 Uhr

Solar
Posts: 3680
Nutzer
Ja. In der Regel ja auch gar kein Problem.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 10:50 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Solar:
Nein, #define's sind nicht typenlos, zumindest nicht in dem Moment in dem sie vom Präprozessor in den Quellcode eingefügt werden. In dem Moment sind das Integer-Literale, somit vom Typ int sofern nicht anders angegeben. Wenn in Sourcen den Typ als ULONG angeben, ist das eine implizite Typumwandlung.

#define 42 -> int
#define 42u -> unsigned int
#define 42l -> long
#define 42ul -> unsigned long


*patsch* ja klar... es kommt ja darauf an, was der Compiler später sieht. Hätte ich mit etwas nachdenken auch selbst drauf kommen können. Danke :)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 11:37 Uhr

Solar
Posts: 3680
Nutzer
Hab' sicherheitshalber noch einmal nachgeschaut; die Sache ist etwas komplizierter...

Ein Integer-Literal (also eines ohne "u" oder "l" dahinter) hat den "kleinstmöglichen" Typ, in dem sein Wert dargestellt werden kann. D.h. der Compiler klappert eine Typliste ab und guckt, ob der Wert des Literals in den Typ reinpaßt.

Geschickterweise unterscheiden sich die Typlisten für dezimale Literale (z.B. 42) von denen für oktale / hexadezimale Literale (z.B. 0x0001): int -> long int -> long long int für Dezimale, int -> unsigned int -> long int -> unsigned long int -> long long int -> unsigned long long int für Hexadezimale.

Somit ist der Typ von 0x0001 abhängig von der Breite eines int - bei 32bit signed, bei 16bit unsigned...

Wie ich den C-Standard liebe. Immer wieder für Überraschungen gut. ;)

[ Dieser Beitrag wurde von Solar am 23.06.2006 um 10:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 13:32 Uhr

Holger
Posts: 8116
Nutzer
Was aber hier zum Glück nicht so eine große Rolle spielt, weil ja die Frage falsch gestellt war. Letztendlich ging es nicht um den Typ der Flagkonstante, sondern den des Flags - dem Struktureintrag.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 13:44 Uhr

bubblebobble
Posts: 707
Nutzer
Also die Notation 0x0001 schreit ja schon nach 16bit.
sonst hätte man auc 0x1 oder 0x00000001 schreiben können.
Da es sich um Flag handelt, macht unsigned etwas mehr Sinn
als signed, aber ist letztendlich egal, weil damit ja nicht
gerechnet wird, sondern nur Bitweise and/or.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 14:19 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Somit ist der Typ von 0x0001 abhängig von der Breite eines int - bei 32bit signed, bei 16bit unsigned...

Ist natürlich völliger Quark, weil die führenden Nullen überhaupt nix aussagen... :glow:

Also ist das Literal signed, punktum.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 14:59 Uhr

Reth
Posts: 1858
Nutzer
@Holger:

Ja nachdem dieser letztendlich den Wert empfängt.

Der Typ der Konstante ist trotzdem interessant gewesen (jetzt mal so für mich). Aber das wird dann wohl compilerabhängig vergeben, je nachdem wie der C-Standard da umgesetzt wurde (danke solar, werd mich wohl nie so tief da reingraben!).

[ - Antworten - Zitieren - Direktlink - ]

22.06.2006, 15:02 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Reth:

Aber das wird dann wohl compilerabhängig vergeben, je nachdem wie der C-Standard da umgesetzt wurde (danke solar, werd mich wohl nie so tief da reingraben!).


Bleibt mir nix anderes übrig - mein aktuelles Programmierprojekt ist eine C-Standardbibliothek. :-D

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Typfrage [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.