sizeof spinnt
-
Hey ihr,
Kanns sein, dass die Pseudofunktion (warum eigentlich "pseudo"?)
sizeof bei array immer das 4-Fache zurück gibt?Folgender Quelltext gibt nämilch 80 als erstes aus:
#include <iostream> #include <vector> using std::vector; using std::cout; using std::cin; using std::string; using std::endl; int main() { const int g = 20; int arr[g]={0}; cout << "\n" << endl; cout << sizeof(arr)<< endl; cout << "BITTE DRÜCKEN SIE EINE TASTE UM DAS PROGRAMM ZU BEENDEN" << endl; cin >> hallo[1 ]; }Woran kann das liegen?
cya
David
-
80 byte!!
20 *4 byte
4 Byte = 32 Bit = Integer
-
sizeof(arr)/sizeof(*arr)überall, außer bei char-arrays nötig.
-
Vollkommen korrekt, da auf Deiner Plattform ein int wohl 4 Bytes groß ist.
sizeof(int) ==> 4Ein
std::cin.get();am Ende des Programms tuts auch (hallo* ist nirgens definiert, sollte also erst gar nicht übersetzen).
@Boris "veto":
Ein Byte kann - muss aber nicht - 8bit haben
-
777 schrieb:
(warum eigentlich "pseudo"?)
sizeof ist ein Operator, keine Funktion. Die Benutzung sieht aus wie ein Funktionsaufruf, vielleicht verwenden deshalb manche den Begriff Pseudo-Funktion. Hab ich aber noch nicht gehört, sehr verbreitet scheint das nicht zu sein.
-
wann hat 1 Byte keine 8 bit?
-
achso... mhh danke.
Aber ich brauche eigentlich die Anzahl der Elemente im Array.
Und vielleicht würde ein anderer Compiler ein int jetzt mit einer anderen Bitzahl definieren und mein Proggi täte nicht mehr funktionieren.Eigentlich würde ein /4 ja jetzt reichen.
Aber nicht gerade Fehlerfrei... -.-
-
@BorisDieKlinge auf manchen uraltsystemen also vor der zeit als sich das 8bit=1byte durchsetzte, gab es auch noch andere varianten. guckst du bspw hier: http://en.wikipedia.org/wiki/Byte#Meanings
-
BorisDieKlinge schrieb:
wann hat 1 Byte keine 8 bit?
Wie groß ein Byte ist, kann der compiler frei definieren (der Standard gibt nur eine Minimalgröße von 8 Bit vor.
@777: Besser ist es, du rechnest "sizeof(arr)/sizeof(arr[0])" (das klappt für beliebige Arrays, solange du sie direkt in der Hand hast (nicht für dynamische Arrays (new[]) oder als Parameter übergebene) - oder gleich std::vector<>.
-
hmm, aber um vernünftig zu programmieren, muss doch jeder vompiler 1 Byte mit 8 bit interpretieren!!
-
warum? oder anders: solange du nicht allzuviel mit bit-shifting spielst, interessiert es dich nicht wirklich, wie groß ein byte auf deiner platform ist, sondern nur wie groß die datentypen sind. da der c und c++ standard aber untergrenzen vorschreiben, kann man sich einfach an die halten und man auch damit keinen streß.
-
ok gut, noch was ! kann ich einen Wert erzeugen welche eine variable anzahl von bits hat!
-
Was meinst du mit "variable Anzahl"? (du könntest einen vector<bool> oder bitset<> verwenden)
-
Gibt übrigens das Makro CHAR_BIT in welchem die Anzahl der Bits pro Byte steht.
-
Ja das ist richtig.
Irgendwo auch logisch
Ich meinte aber, dass es Compiler gibt, die int als 16 Bit-Variable interpretieren.
Andere als 32-Bit Variable?Gibts doch überall Unterschiede...-.-
Zudem muss es doch eine einfache Funktion geben, welche einfach die Objektanzahl eines Arrays zurückliefert.
x.x.cya
David
-
777 schrieb:
Zudem muss es doch eine einfache Funktion geben, welche einfach die Objektanzahl eines Arrays zurückliefert.
Keine Funktion, aber eine triviale Berechnung, die schon zweimal genannt wurde. Gefällt Dir die nicht gut genug?
sizeof(array)/sizeof(*array)oder
sizeof(array)/sizeof(array[0])Oder bau Dir n Template
template< class T, size_t N > inline size_t array_length( T ( &ary )[ N ] ) { return N; }
-
kann der compiler frei definieren
Glaub nicht das das der compiler entscheiden kann

Sondern eher das das vom prozessor kommt ... und ja, es gab prozessoren wo 1 byte = 7 bit.waer doof wenn der Prozessor meint, eine Speicherzelle hat 8 Bit, und der compiler mag nur 7 davon benutzen

dann duerfte der compiler keinerlei erweiterte prozessorbefehle wie multiplikation / division / addition / subtraktion auf registerbasis benutzen wenn ein register mehrere bytes gross ist, weil die operationen ja auf auf ner anderen basis beruhen

Prinzipiell waer sowas vielleicht moeglich, aber praktisch eher unmöglich, rein schon von der performance her ....
<klugscheissmode off>
Ciao ...
-
Das 1 Byte != 8 Bit sein kann ist sowas von egal, ihr wollt nur immer mit eurem wissen angeben. Falls wirklich einer an nem Rechner sitzt, wo das nicht so ist, dann weiß er das. Den Rest verunsichert ihr doch nur.

-
777 schrieb:
Zudem muss es doch eine einfache Funktion geben, welche einfach die Objektanzahl eines Arrays zurückliefert.
x.x.cya
DavidGibts aber nicht. Darum sollst du ja std::vector<> benutzen.
-
kopfschüttel schrieb:
Falls wirklich einer an nem Rechner sitzt, wo das nicht so ist, dann weiß er das.
Toll, und darf etliche Zeit damit verbringen, das Programm anzupassen. Anstatt es einfach durch den entsprechenden Compiler zu jagen und fertig. Was du erzählst, ist Unsinn. Der Standard legt halt einfach nicht fest, dass ein Byte aus exakt 8 Bits besteht. Ende der Geschichte. Wenn du mal ernsthaft programmierst, wirst du lernen, dass dies nur auf zuverlässiger Basis Sinn macht.
-
groovemaster schrieb:
kopfschüttel schrieb:
Falls wirklich einer an nem Rechner sitzt, wo das nicht so ist, dann weiß er das.
Toll, und darf etliche Zeit damit verbringen, das Programm anzupassen. Anstatt es einfach durch den entsprechenden Compiler zu jagen und fertig. Was du erzählst, ist Unsinn.
Na toll, es ist ja nicht genug Arbeit, alle Programme plattformunabhängig zu schreiben, jetzt muss man auch noch mit variabler Bitzahl pro Byte rechnen. Tschuldige, aber das ist auch Unsinn. Meist programmiert man eh nur für ein System (z.B. Standard-Desktop-Windows oder -Linux), wenn's hart auf hart kommt, auch mal für Win, Linux und Mac gleichzeitig. Aber dann noch mit einer variablen Bitzahl zu rechnen, sprengt doch schlicht und ergreifend den Rahmen!