• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

C/C++ und size_t/size_type

Mitglied seit
09.11.2002
Beiträge
880
Reaktionen
0
Hallo.

Bisher habe ich bei der Indizierung von Arrays immer int, bzw halt unsigned int genommen. Inzwischen habe ich aber den Eindruck, daß man für solche Dinge besser size_t oder size_type nehmen sollte.
Was ist denn der Unterschied zwischen den beiden? Diverse Hilfeseiten im Internet schreiben, daß size_type meistens nur eine typedef von size_t ist. Allerdings ist size_type in der string Klasse enthalten. size_t weiß ich jetzt gar nicht wo das definiert ist. Ist size_type also nur die C++ Variante von size_t?

Und wo verwende ich diese Typen genau? Ich habe zB eine Funktion, der wird eine Zahl übergeben, >= 0. Verwende ich dafür unsigned int oder size_t? Diese übergebende Zahl gibt an, mit wievielen "Würfeln" die Funktion würfeln soll. Es ist also eine Mengenangabe.

Der Rückggabewert der Funktion ist das Ergebnis des Würfelns, also eine Summe, keine Mengenangabe. Rein von meinem Verständnis der Lesbarkeit des Codes sollte der Rückgabewert also ein unsigned int sein, eine "echte Zahl", während die Mengenangabe dann eben so ein size_t sein sollte.

Danke für ein paar klärende Worte!
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Müsste in der stddef.h definiert sein. Soweit ich weiß als long unsigned int.
Ich hab size_t bisher nur in ganz wenigen Ausnahmefällen
verwendet, von denen mir aktuell kein einziger mehr einfällt. Für die meisten Fälle dürfte unsigned int vollkommen genügen.
 

The_Company

Guest
size_t is der Wert, den man an malloc übergibt und der von sizeof() zurückkommt - nämlich um Grössen von etwas anzugeben. Also sollte size_t gross genug sein um die Differenz von 2 Pointern zu halten.
(unsigned) int war der schnellste Typ auf der CPU und ist inzischen de facto 32bit weil zuviele Programme sonst nicht funzen würden.
(unsigned) long ist sowas wie grösster Typ auf der CPU, weshalb er meistens (immer?) gleich gross ist wie size_t, da er so gross ist wie ein Pointer (Architekturgrösse halt).
Und natürlich gibts noch ptrdiff_t, was praktisch die signed Version von size_t ist und Das Ding, was man bekommt, wenn man Pointer voneinander abzieht.
So, das sind die C Typen, von C++ hab ich kA.

"a[x]" ist equivalent (ich glaub das steht sogar so in der C spec zu "*((a) + (x))", womit x idealerweise size_t sein sollte. Aber wenn man weiss, dass das array kleiner als INT_MAX ist, tuts natürlich auch nen int.
 
Mitglied seit
09.11.2002
Beiträge
880
Reaktionen
0
OK, ich werde dann weiter int verwenden, ist auch irgendwie deutlich lesbarer im code.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
also ich jetzt alles andere als ein experte, aber ich nehm size_t für alles, was mit array (vector usw.) indizierung zu tun hat, also laufvariablen in for schleifen zBsp - aber mit int machst du da auch nicht wirklich was falsch, glaub ich.
 
Zuletzt bearbeitet:
Mitglied seit
19.09.2001
Beiträge
2.379
Reaktionen
17
Hallo.

Bisher habe ich bei der Indizierung von Arrays immer int, bzw halt unsigned int genommen. Inzwischen habe ich aber den Eindruck, daß man für solche Dinge besser size_t oder size_type nehmen sollte.
Was ist denn der Unterschied zwischen den beiden?

ich habe das gefühl, dass du dir wirklich gedanken gemacht hast und dich gut informiert hast. der eindruck ist ja sicher nicht auf dem klo über dich gekommen :)
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
wirft der compiler nicht sogar ne warnung, wenn man sowas schreibt:
Code:
vector<int> feld;
for( int i=0; i<feld.size(); ++i)
da der vergleich probleme machen kann, da ja size() nen size_t zurückgibt?
 

The_Company

Guest
Ja war es.
Wüsstest Du sogar, wenn Du meinen Beitrag gelesen hättest :p
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
49.637
Reaktionen
10.259
ich hab echt null ahnung von c und so, aber das ist ja mal krass hier - dh der compiler meckert erst bei einer bestimmten einstellung, das da zwei datentypen nicht zusammenpassen? wie gesagt, nicht hauen wenn die frage dohv ist oder, aber in java würde sich sowas zwar problemlos compilen lassen, aber es würde automatisch nen warning geben...
 

bog

Mitglied seit
02.08.2002
Beiträge
10.121
Reaktionen
0
Ort
auf dem mutterschiff
na klar. im nazimode (-Wall) wirft er fuer alles warnungen aus, was auch nur schief aussieht. da lamentiert er dann auch, wenn du unsigned int (idR kleinerer size_t) mit signed int vergleichst - schliesslich sind die fuer gewoehnlich gleich gross, aber haben unterschiedliche wertebereiche. in den meisten schleifen und if-abfragen ist das voellig egal, aber wenn die beiden typen auch vergleichbar sind, sind sie nicht gleich.

gibts denn in java ueberhaupt den unterschied zwischen unsigned und signed integern? wirft ein java-compiler keine warnung, wenn du float und int vergleichst?
 

The_Company

Guest
C compiler warnen nicht bei float und int. Die warnen nur bei gleich grossen Datentypen mit unterschiedlichen Wertebereichen wo durch einen nicht erwarteten cast alles den Bach runter ginge. Das ist aber klar definiert (der Vergleich wird unsigned durchgeführt, d.h. -1 wird zu UINT_MAX gecastet und ist grösser als alles andere (und nicht kleiner).

gcc spuckt normalerweise nur Fehler aus. Mit -Wall spuckt er alle Warnungen aus, wo er relativ sicher ist, dass Du gerade Scheisse baust. Von Nazi Mode ist das aber noch weit weg. Nazi mode ist -Wall -Wextra -Werror (plus noch nen paar andere Warnungen, die ich immer an habe).
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html falls Du Dich mal in C und dessen Fallstricke einarbeiten willst. ;)
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
gibts denn in java ueberhaupt den unterschied zwischen unsigned und signed integern? wirft ein java-compiler keine warnung, wenn du float und int vergleichst?

ist alles signed (ausser char). warnung dürfts keine geben, auch wenn informationen beim casting auf float verloren gehen können.
 

bog

Mitglied seit
02.08.2002
Beiträge
10.121
Reaktionen
0
Ort
auf dem mutterschiff
klar sollte man das (zumindest fuer stabilen code), wenn er aber weiss, dass die verwendung von normalen ints nicht zum problem wird, kann er ja seinem aesthetikempfinden nachkommen.
 
Mitglied seit
09.11.2002
Beiträge
880
Reaktionen
0
Also doch size_t verwenden, zumindest wenn man beispielObject.size() mit einer Zahl vergleicht. Macht auch irgendwie Sinn, aber mein Editor zB hat bei int syntax highlighting, nicht jedoch bei size_t, was mich beim Lesen immer ein wenig stört.
Danke für die Diskussion!
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
ja ist durchaus ne gute idee so zu programmieren, dass -Wall nicht meckert (zumindest mit gcc - beim icc reicht -w2 mMn) :)
 
Oben