Negative Zahlen abiehen??
-
Hallo zusammen, ich wollte mal wissen, warum der folgende Code nicht funktioniert:
inline void input(vector<double> &myvector, double position, double in = 0.0) { if (position >= myvector.size()) { position -= (myvector.size() - 1); //position = 10000 und die Größe ist 0 for(; position > 1; position--) myvector.push_back(0);//so, und jetzt steht halt -452300.0000 drin oder so ähnlich } myvector.push_back(in); }Dieser funktioniert aber:
inline void input(vector<double> &myvector, double position, double in = 0.0) { if (position >= myvector.size()) { position -= (myvector.size()); //so, jetzt einzeln position++; for(; position > 1; position--) myvector.push_back(0); } myvector.push_back(in); }
-
vector::size() liefer einen Wert mit Typ unsigned zurueck. Was passiert wenn du davon 1 abziehst, wenn der Wert 0 ist?
-
vector::size() ist vom Typ size_t, was in der Regel ein unsigned integer Typ ist. Und da du im ersten Programm (size()-1) in Klammern stehen hast, wird diese Rechnung zuerst ausgeführt und zwar mit unsigned integer Arithmetik. Und da ist 0-1 eben nicht -1 sondern das Maximum dieses Datentyps.
P.S.: double als Positionsangabe für einen Vector? Möglicherweise hast du gute Gründe, sieht aber schon irgendwie nach komischem Design aus.
-
knivil schrieb:
vector::size() liefer einen Wert mit Typ unsigned zurueck. Was passiert wenn du davon 1 abziehst, wenn der Wert 0 ist?
Dann steht 11111111111111... drin

Danke!So funktionierts jetzt auch ein bisschen eleganter:
position -= ((signed)myvector.size() - 1);
-
wxSkip schrieb:
So funktionierts jetzt auch ein bisschen eleganter:
position -= ((signed)myvector.size() - 1);Da finde ich deine zweite Variante aber Eleganter. Hier machst du nämlich Fehler, falls der Vector mehr Elemente enthält als in signed passen. Bei deiner anderen Variante ist immer alles richtig.
-
SeppJ schrieb:
wxSkip schrieb:
So funktionierts jetzt auch ein bisschen eleganter:
position -= ((signed)myvector.size() - 1);Da finde ich deine zweite Variante aber Eleganter. Hier machst du nämlich Fehler, falls der Vector mehr Elemente enthält als in signed passen. Bei deiner anderen Variante ist immer alles richtig.
Stimmt, aber wenn das der Fall ist, dann enthält position noch mehr Elemente als myvector.size() (sonst wäre die if-Bedingung false) und das geht nicht, weil position unsigned ist
