cast
-
ich habe einen sting zeitfeld. in diesen wird "hoffentlich" eine uhrzeit 00X00 eingeben, um daraus tagesminuten zu errechnen.
int tagesminuten = (static_cast<int>(zeitfeld[0]*10) + static_cast<int>(zeitfeld[1]))*60;
wenn ich nun 00:00 berechnen lasse erhalte ich das ergebniss 31680. Also wird mein asci-wert 48 der ja der eingabe 0 entspricht als grundlage der berechnung genommen. aber eigentlich sollte da ja 0 rauskommen. wo liegt mein fehler?
mfg
zimmys
-
Zunächst müsstest Du uns mal sagen wie zeitfeld deklariert ist.
Dann, wieso einmal mit 10 multiplizieren und dann casten, anderes mal erst casten und dann mit 60 multiplizieren? EDIT: Verguckt, ist erst addieren und dann mit 60 multiplizieren.
WENN zeitfeld ein String ist, wertest Du eh nur die Stunden aus (die ersten beiden Ziffern), und das relativ seltsam.
EDIT (letzter): DAS passiert wenn man die Helfer rumraten lässt. Der Ausdruck berechnet (bzw soll berechnen) den Stundenanteil an den Tagesminuten, was?
So, genug geraten, räum erstmal auf :p
-
Du weißt also, dass 0 den Ascii-Wert 48 hast und wunderst dich warum es nicht richtig arbeitet?
Wie wäre es wenn du vor der Multiplikation mal 48 subtrahierst?
-
auf die idee 48 abzuziehen bin ich auch schon gekommen. diese lösung erscheint mir aber doch etwas bauernhaft. ich dachte ich kann das irgendwie direkt casten.
natürlich würde ich so nur die ersten zwei felder auswerten, ich wollte ja auch nur den symblischen weg. aber wenn du das alles willst:
CZeit::parseZeit(const string& zeitfeld){
bool valueIsValid=false;
if(zeitfeld.size()<=5){
int i=0;
do{ //FEHLERHAFT
switch (zeitfeld[i]){;
case '0': valueIsValid=true;
case '1': valueIsValid=true;
case '2': valueIsValid=true;
case '3': valueIsValid=true;
case '4': valueIsValid=true;
case '5': valueIsValid=true;
case '6': valueIsValid=true;
case '7': valueIsValid=true;
case '8': valueIsValid=true;
case '9': valueIsValid=true;
default: {valueIsValid=false; break;}
}i++;
if (i==2)i++;}while(i<=4 && valueIsValid);
if (valueIsValid){ //errechnet die tagesminuten
int tagesminuten = (static_cast<int>(zeitfeld[0]*10) + static_cast<int>(zeitfeld[1]))*60;
int bufferminuten = (static_cast<int>(zeitfeld[3]*10) + static_cast<int>(zeitfeld[4]));
tagesminuten+=bufferminuten;
}
}return tagesminuten;
};
-
@switch: Dir ist hoffentlich klar, daß switch-case von der richtigen case-Marke bis zum Ende des switch-Blocks durchgeht, wenn du es nicht mit "break;" verlässt (und an der Stelle, wo du ein break gesetzt hast, ist es sinnlos ;))?
(und wenn dir das -'0' (oder -48) nicht gefällt, schau mal in der FAQ unter "Einmal Zahl und zurück")
-
Zum Validieren von Benutzereingaben würd ich dir zu boost::regex raten, einfach genial

-
ok, das mit dem break ist mir klar. leider habe ich dein faq einmal zahl und zurück nicht gefunden?
-
Nimm diesen FAQ-Eintrag, bis du einen anderen findest

-
dann kann ich ja auch lange nach "Einmal Zahl und zurück" suchen.
aber vielen dank.
mfg
zimmys