C size_t in string.h -> Welcher Datentyp?

gecco

gecco

Aktives Mitglied
Thread Starter
Dabei seit
03.09.2005
Beiträge
425
Reaktionspunkte
1
Hi,

ich sitze hier an einem Problem; und zwar will ich eine Funktion aus einer Std-Bibliothek benutzen (strlen) um die Länge eines char[]-Arrays auszulesen.
Strlen übergiebt die gesuchte Zahl auch korrekt, jedoch motzt der Compiler, dass es bei der conversation von size_t zu uint8 (Variable für die charlänge muss uint8 sein)
welches Types ist denn nun size_t?? Ich finde da nichts konkretes!

ich habe es jetzt "unschön" gecastet, da ich für das Programm sicher sein kann, dass der Wertebereich für uint8 auf keinen Fall überschritten wird!
Code:
PhoneNoLength = (uint8)strlen(TestNumber);
PhoneNoLength ist eben vom Typ uint8 TestNumber ist ein char[20]

Wie kriege ich das Ganze "sauber" gelöst??
DANKE
 
such nächste mal genauer in types.h ;)

Code:
typedef __darwin_size_t		size_t;
Code:
#if defined(__GNUC__) && defined(__SIZE_TYPE__)
typedef __SIZE_TYPE__		__darwin_size_t;	/* sizeof() */
#else
typedef unsigned long		__darwin_size_t;	/* sizeof() */
#endif

eine unsigned long auf 8-bit unsigned integer zu casten ist auch nicht unbedingt das schlaueste was man machen kann ;)
da gibt es doch bestimmt konvertierungsroutinen...
 
gecco schrieb:
welches Types ist denn nun size_t?? Ich finde da nichts konkretes!

Ein Typ, der für solche Größenangaben geeignet ist. Also ganz bestimmt nicht uint8. Was spricht dagegen, einfach auch size_t zu benutzen? Das wäre das sauberste.
 
Der Kompiler meckert, weil hier eine "Vereinbarung" gebrochen wird:

strlen sagt: Ich gebe Werte von 0 bis*4294967295 aus (Wertebereich von unsigned long)
Du sagst: Ich akzeptiere Werte von 0 bis 255 (Wertebereich von unsigned char)

Dass in Deinem speziellen Fall dieser Bereich ausreicht mag ja sein. Aber woher soll der Compiler das wissen? Und was soll er tun, wenn strlen jetzt 512 ausgibt?

Das so zu Casten ist keine gute Idee.

Alex
 
Hat sich schon erledingt, habe entsprechendes noch von einem kollegen bestätigt bekommen.
klar wäre ein unsigned long (oder besser einfach ein size_t) sauber, aber auf der Hardware ist aber kein Platz für überflüssige Bytes, und somit ist uint8 perfekt.
hat sich damit also erledigt, es wird exakt so laufen wie oben von mir beschrieben. Da hier Telefonnummern übergeben werden und diese seltenst eine Länge von 255 überschreiten (ja, solange der Mars noch nicht besiedelt ist, ok) sind sämtliche höherwertigen (stelligen) Bits für mich und das Programm absolut sinnfrei

Danke trotzdem
 
gecco schrieb:
Da hier Telefonnummern übergeben werden und diese seltenst eine Länge von 255 überschreiten (ja, solange der Mars noch nicht besiedelt ist, ok) sind sämtliche höherwertigen (stelligen) Bits für mich und das Programm absolut sinnfrei

Richtig. Wie ich oben geschrieben hast weisst Du das, und ich auch. Aber gcc halt nicht ;)

Alex
 
Der gcc muss das auch nicht wissen;) Es muss nur funktionieren!

ok, habe verstanden worauf du (und die anderen) hinauswolltest

bevordie Frage auftritt: Ja die Telefonnummern werden zuvor an anderer Stelle auf Sinnhafigkeit (gibt es das Wort überhaupt?) überprüft
 
Öffentliche Telefonnummern sind eh auf 20 Stellen begrenzt - so zumindest mein letzter Stand aus den ETSI-Bibeln ;)
 
Nicht falsch aber auch nicht komplett richtig!

Es gibt ja noch "erweiterungen" zu den Telefonnummern. Also post-Addressnummern z.B. für DTMF (wurde früher mal verwendet um ABs fern-abzuhören)
 
Zurück
Oben Unten