003
03.10.2008, 11:46 Uhr
0xdeadbeef
Gott (Operator)
|
bezeichnet einen unvollständigen Typen, dementsprechend darfst du sizeof darauf gar nicht anwenden (5.3.3 im Standard). Dass dein Compiler das akzeptiert ist seltsam, und mehr oder weniger zufällig; jedenfalls kann dir das jeder andere Compiler (oder spätere Version des Compilers, den du benutzt) um die Ohren hauen.
Jetzt wo das aus dem Weg ist, ein Array in C++ (und auch in C, da kommt das her) ist kein komplexer Datentyp, wie du das aus Java kennst. Es ist einfach ein flacher Speicherbereich, in dem die Objekte, die den Inhalt des Arrays darstellen, stumpf hintereinander liegen. Das bedeutet insbesondere, dass ein Array seine eigene Größe nicht kennt. Außerdem ist wichtig zu wissen, dass sizeof keine Funktion ist, und zur Compilezeit aufgelöst wird. Das bedeutet, zur Laufzeit, wenn die Funktion aufgerufen wird, steht da schon nichts mehr von sizeof, sondern schlicht eine Zahl.
Wie löst man das also? Man kann, wie TOSHMAX das beschreibt, die Größe von Hand mitgeben, allerdings ist das auf die Art eher in C üblich. In C++ benutzt man typischerweise std::vector:
C++: |
#include <iostream> #include <vector>
void print_vector(std::vector<int> const &v) { std::cout << "Vektor der Länge " << v.size() << " enthält: "; for(int i = 0; i < vec.size(); ++i) { std::cout << vec[i] << ' '; } std::cout << std::endl; }
int main() { std::vector<int> vec(20); // Mit anfänglich zwanzig Elementen bauen
vec.resize(10); // Ach ne, wir brauchen doch nur 10
for(int i = 0; i < vec.size(); ++i) { vec[i] = i; }
print_vector(vec); }
|
Das ist jetzt natürlich nur ein kleiner Ausschnitt dessen, was std::vector kann, aber die Grundidee sollte klar werden. Es ist ein Array dynamischer Länge und bildet dessen Interface plus nützliches anderes Zeug ab - genaueres dazu findest du mit Sicherheit in deinem C++-Buch. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |