Fehler bei vectoren
-
Hallo, ich kriege beim Kompilieren immer die Meldungen:
error C2057: Konstanter Ausdruck erwartet
error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
error C2133: 'values': Unbekannte GrößeDie Fehler beziehen sich alle auf die zweite Zeile des Quelltextausschnitts. Hier mal der Code:
vector<int> possibilities = findPossibilities(spheres); float values[possibilities.size()];Verstehe nicht warum der ein Problem hat ein Array in der Größe von "possibilities" zu machen. Jemand ne idee?
-
Ganz einfach, Arrays brauchen bei der Deklarierung immer einen konstanten Größenausdruck, was ja auch deine Feherlmeldung:
error C2057: Konstanter Ausdruck erwartet
aussagt.
Und da std::vector<T>::size() zur Laufzeit varrieren kann, kannst du damit kein Array deklarieren. Es wäre so möglich:float* values = new float[possibilities.size()];Oder du nimmst einfach einen neuen vector
-
size() wird erst zur laufzeit ausgewertet, die größe eines arrays muss zur
compile-time feststehen.nimm doch noch einen vector
vector<float> values(possibilities.size());
-
Jo, da hätte ich auch ma drauf kommen können^^
Habs jetzt mit noch nem vector gemacht. Danke!
-
Wenn es "const vector......" wäre dann würde es aber doch schon gehen oder?
MfG
Stromberg
-
Stromberg_ schrieb:
Wenn es "const vector......" wäre dann würde es aber doch schon gehen oder?
MfG
StrombergNope.
(IIRC kommt etwas Ähnliches im nächsten Std - "constexpr" und C99 kennt "VarArrays")Einfaches Gegenbeispiel:
void f(vector<int> const& v); int main() { vector<int> v(20); // -> size() == 20 f(v); v.resize(40); // -> size() == 40 f(v); ... void f(vector<int> const& v) { int arr[v.size()]; // was soll der Compiler hier nehmen?Es geht hier um Compilezeitkonstanten also Variablen, deren Wert bereits zur Compilezeit festeht....
Sowas geht derzeit nur "static-const-Integralen" (int, char, ...., keine Ahnung, ob ich den richtigen Ausdruck dafür verwendet habe), die bereits bei der Deklaration initialisiert werden.
Gruß,
Simon2.
-
Ich verstehe es immer noch nicht. Wenn ich einen "const vector<int> vec(20,7)" habe, dann kann der ja weder seine Elementanzahl verändern, oder die Werte der Elemente oder? Also ist doch zur Kompilierzeit alles fest?
MfG
Stromberg
-
Stromberg schrieb:
Ich verstehe es immer noch nicht. Wenn ich einen "const vector<int> vec(20,7)" habe, dann kann der ja weder seine Elementanzahl verändern, oder die Werte der Elemente oder? Also ist doch zur Kompilierzeit alles fest?
der funktionsaufruf v.size() kann nur zur laufzeit passieren, nicht zur compilezeit. das ergebnis steht zwar fest, weil wie total klug sind, der compiler isses aber nicht. der müßte v.size() aufrufen, aufrufen mag er's aber nicht, weil er erst die datei compilieren will.