size_t?

enr00

enr00

Routinier
Was ist eigentich size_t, welche Werte kann man darin speichern, und wie kann man selbst so einen Datentyp entwerfen?
 
size_t sollte nur ein typedef sein, iirc, also:
Code:
typedef unsigned long size_t;
 
Zuletzt bearbeitet:
size_t ist nach dem ANSI-C-Standard der Datentyp, in dem Längen von Strings und anderen Speicherbereichen angegeben werden sollen.
Also für gewöhnlich wird size_t wie folgend definiert:
typedef unsigned long size_t;
Was du darin speichern kannst, hängt von der Architektur ab, bei mir ist er 4 Bytes lang, ich kann also darin Ganzzahlen von 0 bis 4294967295 speichern.
Wie man eigene Datentypen definiert hat sich damit auch erledigt, oder?
 
Wenn auch schon ein wenig älter, aber trotzdem meine Frage.

Gibt es irgendwo Listen, in denen solche Definitionen ALLE (dem Standard entsprechend) drin sind?
 
Ich meine nicht die Funktionen und Header Beschreibungen, sondern Sachen wie
Code:
typedef unsigned long size_t;
PS: I didn't
 
Ich kann bei dem Thema, als Hobbyentwickler der mit C++ angefangen hat, nur empfehlen viel Code lesen.
Mit der Zeit kommen solche gebilde immer mal wieder :)
Vor allem wenn man mit der C++ STL arbeitet, egal ob beruflich oder nicht, man findet bei strings viele solcher Sachen :)

Ansonsten kann man eigene Datentypen eher mit structs erzeugen.
typedef ist eher dazu da um alten Datentypen neue Namen zu verpassen.
Bei einigen Dingen wie bei size_t ist dies auch okay.
Aber eigene komplexe Datentypen kann man nicht mit typedef abbilden.
Hier bräuchte man schon structs.
In C++ kann man diese eigentlich weglassen und gleich Klassen nutzen.
Aber als Datentypen sind structs doch immer nützlich :)

Anbei noch einmal zum Thema typedef.
Ich würde dir auch empfehlen, wenn du solche typedefs im C Standard suchst, dann lies mal einige der C Header durch.
Dort sind die ganzen typedefs passend verteilt :)

Bzw. kann dir auch OpenGL viele typedefs bieten.
Dort gibt es zu jedem Datentyp, egal ob int char whatever, ein typedef.
Diese sehen dann wie GLFloat, GLDouble etc. aus.
Kenne die jetzt nicht genau also das Beispiel nicht so ernst nehmen ^^

Okay heir ein passendes Beispiel:
http://www.koders.com/cpp/fid46C0152428EBEB242EBF7D3F640B0B8AFDD8FB97.aspx?s=cdef:opengl

unter der C WinAPI gibt es auch sachen wie WORD etc. als Datentypen :p
 
Zuletzt bearbeitet:
Vielen Dank :)
Naja, eine Liste soll ja das Header durchforsten abstellen ;) Aber mal sehen...
unter der C WinAPI gibt es auch sachen wie WORD etc. als Datentypen :p
Das ist doch auch gut so, ein word ist ein 16 Bit wert, zwei Bytes.
 
Code:
egrep '^typedef .+ [a-zA-Z]+_t;$' /usr/include/* -R
 
Wo ist den unter Windows den /usr/include/ :-)?

so far
MFG 4k3nd0
 
Off Topic

Ansonsten kann man eigene Datentypen eher mit structs erzeugen.
typedef ist eher dazu da um alten Datentypen neue Namen zu verpassen.
Bei einigen Dingen wie bei size_t ist dies auch okay.
Aber eigene komplexe Datentypen kann man nicht mit typedef abbilden.
Hier bräuchte man schon structs.
Häh ?

Alter Datentyp == Basisdatentyp...wieso alt ?
(Nur) Bei einigen Dingen...?

Beispiel: Definition
Code:
// vorausgesetzt char, short, long, usw. sind tatsächlich auf der Ziel Architektur so lang --> für nähere Details --> limits.h
typedef unsigned char  u08;
typedef   signed char  s08;
typedef unsigned short u16;
typedef   signed short s16;
typedef unsigned long  u32;
typedef   signed long  s32;
typedef unsigned long long u64;
typedef   signed long long s64;
// wobei hier Namen wie u08_t, s08_t, u16_t, usw. verständlicher wären...
// ist aber Geschmackssache...
(So ähnliche Definitionen befinden sich zum Beispiel in stdint.h.)
Ich brauch anschließend nicht mehr unsigned char [varName] schreiben. u08 [varName] reicht. :)

Beispiel: Anwendung
Code:
u08 variableOhneVorzeichen8Bit = 217;
s08 variableMitVorzeichen8Bit = -37;
u16 variableOhneVorzeichen16Bit = 516;
// usw. ...
Imho recht nützlich wenn der verwendete Editor keine Autovervollständigung (IntelliSense...so nennt es MS) kann.

typedef funktioniert auch bei Strukturen, Unions, Klassen (C++)...
Beispiel: Definition
Code:
typedef struct str_Time
{
	
   u08 hours;
   u08 minutes;
   u08 seconds;		
   u16 year;

} str_Time_T;

Beispiel: Anwendung
Code:
str_Time_T zeit = {08, 18, 00, 2009}

Cool oder ? ;)

Zusammenfassend:
Typdef ist eine nette Funktion mit der ich fauler Programmierer mir die Schreibarbeit verkürzen kann... :D

Hat aber imho auch Schattenseiten...der Code könnte für Andere dadurch schwerer zu lesen/verstehen sein...deswegen wahrscheinlich oiermanns Frage...

Wo ist den unter Windows den /usr/include/ :-)?

Ich würde eher fragen: "Ist egrep standardmäßig bei Windows installiert ?" ;)
Wobei unter Unix/Linux Systemen auch nicht alle Header-Dateien unter /usr/include installiert werden...

Guggst du "Start|Suchen" und suchst bspl.-weise nach der stdio.h oder so
...oder bei den Einstellungen deiner IDE...
:)
 
Off Topic

Windows suche....? Geht nicht :P
Auch wenn mich manche jetzt als Verräter oder Sonstiges (Troll, etc.) bezeichnen...

Nicht falsch verstehen:

Ich benutze sehr gerne Unix/Linux Systeme. Ich werde höchstwahrscheinlich auch nie wieder ein Windows System als Hauptbetriebssystem verwenden...
Aber hier muss ich Windows (zumindestens die Win XP Suchfunktion) verteidigen:

Gilt für kfind (KDE 3.5.9, höhere Versionen -> kA...noch nicht verwendet):

Wenn ich diese Variante von kfind mit der Windows Suchfunktion vergleiche, hilft nur folgendes :devil::
Code:
$ rm -f /opt/kde3/bin/kfind
Klingt zwar hart, aber ich kann prinzipiell keine Programme leiden, bei der die Benutzeroberfläche sehr oft eine längere Zeit (>1 Minute) einfriert.
Tritt auf wenn man das komplette Dateisystem (file:///) durchsucht, nach einer gewissen Zeit auf Anhalten klickt und danach das Programm schließen will.
Es geht zwar das Programm schneller zu beenden (CTRL + ALT + ESC oder "killall kfind")...ist aber nicht wirklich sauber..

Naja, mal sehen ob die höheren Versionen besser sind...falls nicht, versuch ich kfind halt mal selber optimieren...sofern ich halt Zeit habe...
Derweil verwende ich halt weiterhin find, etc...

the same...
 
Zuletzt bearbeitet:
Code:
typedef struct str_Time {
   u08 hours;
   u08 minutes;
   u08 seconds;		
   u16 year;

} str_Time_T;
So geht das meiner Meinung (und meiner Referenz und meinem Kompiler) nach nicht. Du kannst nicht innerhalb eines typedef's das struct definieren. Ausserdem ist dies unnoetig. Deine str_Time_T ist (ohne das 'typedef') ein Object vom Typ struct str_Time und kein Alias darauf.
 
Ich kenn genau dieses muster von der Windows XP suche, denn ein "Suchtool" wie in Windows auf einer Maschiene mit 555 Mhz, bringt schon das blosse anklicken die Maschiene zum still Stand. Dazu benutzte ich Gnom, wo ich sehr zufrieden und kaum Problem mit der Suchfunktion.
 
Du kannst nicht innerhalb eines typedef's das struct definieren.
Öh, was genau meinst du damit?
Code:
typedef struct foo { ... } foo;
foo bar;
struct foo baz;
bar und baz haben nun den gleichen Typ (struct { ... }), foo ist hier einmal das (der/die?) typedef und einmal das struct-Tag, welche in separaten namespaces existieren.
Deine str_Time_T ist (ohne das 'typedef') ein Object vom Typ struct str_Time und kein Alias darauf.
Ohne das typedef ist str_Time_T eine Variable, ja, aber mit dem typedef ist es, wer hätte das gedacht, ein typedef. Ich versteh irgendwie nicht was du uns damit sagen willst.

Wobei unter Unix/Linux Systemen auch nicht alle Header-Dateien unter /usr/include installiert werden
Ok, und welche header wären das? (Abgesehen von kernel-Headern, um die es hier soweit ich das sehe nicht ging.)

Code:
u08 variableOhneVorzeichen8Bit = 217;
Ist Quatsch, sizeof(char) ist garantiert 1, aber es wird nirgendwo garantiert, dass ein byte soundsoviel bits hat. Das ist also völlig plattformabhängig und Namen wie u08 sind IMHO irreführend.
 
Off Topic

Ok, und welche header wären das? (Abgesehen von kernel-Headern, um die es hier soweit ich das sehe nicht ging.)
Je nachdem was man installiert hat bzw. das Herz benötigt:

Ein paar Beispiele.:
KDE3 --> /opt/kde3/include

Wobei KDE und andere Konsorten (meistens) keine Standard Header (stdio.h, stdlib.h, etc.) enthalten...

Cross Platform Toolchains/SDKs aber schon...hier enthalten auch die Standard Header nicht immer die gleichen Funktionen, typedefs, etc...
Arch: Atmel AVR
--> /opt/cross/avr/include

Arch: Cell Broadband Engine
--> /opt/cross/spu/sys-root/usr/include

Arch: PSP
--> /usr/local/pspdev/psp/include

Anzumerken ist aber auch das Vieles distrubtionsabhängig ist...

Ist Quatsch, sizeof(char) ist garantiert 1, aber es wird nirgendwo garantiert, dass ein byte soundsoviel bits hat. Das ist also völlig plattformabhängig und Namen wie u08 sind IMHO irreführend.

Überlesen ? Hab eigentlich fast das Gleiche damit gemeint.
Ich zitiere mich mal selber:
// vorausgesetzt char, short, long, usw. sind tatsächlich auf der Ziel Architektur so lang --> für nähere Details --> limits.h
typedef unsigned char u08;
[...]
// wobei hier Namen wie u08_t, s08_t, u16_t, usw. verständlicher wären...
// ist aber Geschmackssache...
Gut, vielleicht nicht verständlich formuliert..
Vorausgesetzt char, short, long, usw. haben auf der Ziel-Plattform/Architektur tatsächlich diese Anzahl an Bits. Jetzt besser formuliert ?
limits.h existiert aber auch nicht immer...

Zu u08, s08, etc
Zitate aus den Kernel Dokumentationen (/usr/src/linux/Documentation/CodingStyle)
u8/u16/u32 are perfectly fine typedefs, although they fit into category (d) better than here.
Das rot markierte gefällt mir..bin auch dieser Meinung...
und weiter...
Although it would only take a short amount of time for the eyes and
brain to become accustomed to the standard types like 'uint32_t',
some people object to their use anyway.

Therefore, the Linux-specific 'u8/u16/u32/u64' types and their
signed equivalents which are identical to standard types are
permitted -- although they are not mandatory in new code of your
own.
 
Ja, die Info war in einer ziemlich langen Zeile (die ich zum Durchlesen scrollen hätte müssen) versteckt, außerdem in einem (auch noch C++/C99) Comment, da hab ich wohl mental abgeschaltet, sorry.

Cross Platform Toolchains/SDKs aber schon.
Durchaus, hatte ich nicht dran gedacht.

Hm, zu den typedefs ansich: wie ist das auf Plattformen wo ein char 7bit hat?
Gibts da dann kein "u08" sondern ein "u07"? (Wäre ja das einzig Sinnvolle.)
Ich meine Linux wird ja afaik auch viel im embedded-Bereich eingesetzt, also ist die Frage wohl nicht so weit vom Schuss.

Das rot markierte gefällt mir.
Naja, wohl Geschmackssache. Solange ein u16 wirklich 16bit lang ist, find ichs zumindest teilweise sinnvoll. Wenn das aber nicht gewährleistet ist (kA ob das so ist, siehe vorherige Frage), würde ichs generell ablehnen.
 

Ähnliche Themen

Kernel Kaltstart / reboot?

Mit bash Skript bestimmte Werte aus Tabelle lesen

Per Samba falsche Angaben zum freien Speicherplatz übertragen

Werte unterschiedlichen Types aufnehmen.

Hilfe bei Interpretation des RAM-Speicherverbrauchs

Zurück
Oben