S
Schifty schrieb:
Wenn ich das Array in der Main erstelle
CUSTOMVERTEX cube[] = {...};
und direkt dahinter sizeof(cube) schreibe erhalte ich die Größe des gesamten Arrays.
Korrekt. Größe in Bytes.
Schifty schrieb:
Übergebe ich an eine Funktion:
new Object(cube);
Object::Object(CUSTOMVERTEX vertexArray[]) {...}
Und schreibe hier sizeof(vertexArray) erhalte ich die
größe des Pointers, bzw mit * die Größe des ersten Elements.
Korrekt.
Schifty schrieb:
Ich dachte es handelt sich in beiden Fällen um Pointer auf das erste Element? Wo liegt der unterschied,
Nein. Das erste ist ein Array vom Typ CUSTOMVERTEX[N] (nicht CUSTOMVERTEX[] !) mit N=Anzahl der Elemente. Das zweite ist ein Zeiger. Großer Unterschied!
C++ erlaubt Dir einfach bei der Definition von cube das N wegzulassen. Der Compiler ist so schlau, dass er das selbst einsetzen kann, nachdem er die Elemente gezählt hat.
Der Typ CUSTOMVERTEX[] hingegen wird in der Parameterliste einer Funktion zu CUSTOMVERTEX übersetzt*. Auch eine Größe, falls angegeben, wird ignoriert. Diese Ersetzung des Typs findet statt, weil es in C auch so ist, weil man dachte es wäre praktisch, und weil Arrays keine Kopier-Semantik haben. Diese Ersetzung gibt es nur, falls das [] sich auf der "obersten Ebene" befindet. Ein Zeiger ( int(*)[3] ) oder eine Referenz ( int(&)[3] ) auf ein Array gibt es also als möglichen Parameter.
CUSTOMVERTEX[] ist aber auch als "unvollständiger Typ" in einer Deklaration auf globaler bzw Namensraum Ebene und innerhalb von Klassen für statische Elemente zulässig (Array mit Größe, die nicht verraten wird). Da es sich in dieser Situation um einen unvollständigen Typ handelt, ist die Anwendung von sizeof gar nicht zulässig.
Schifty schrieb:
und gibt es eine Möglichkeit im letzteren Fall, ersteres sizeof-Ergebnis zu erlangen?
Nur, wenn Du den Konstruktor von Object änderst. Hier mal eine Inspiration:
template<typename T>
class referenz_auf_bloedes_array
{
T* base_;
std::size_t size_;
public:
referenz_auf_bloedes_array(T* base, std::size_t N)
: base_(base), size_(N) {}
template<std::size_t N>
referenz_auf_bloedes_array(T (&ref)[N])
: base_(ref), size_(N) {}
std::size_t size() const {size_;}
T& operator[](std::ptrdiff_t idx) const {return base_[idx];}
};
void foo(referenz_auf_bloedes_array<int> r) {
if (3u <= r.size()) {
r[0] = 1;
r[1] = 2;
r[2] = 3;
}
}
int main() {
int xx[] = {9,9,9,9,9};
foo(xx);
}
Gruß,
SP