2016-02-13 2 views
-1

Итак, идея состоит в том, что для каждого числа нажатых число нажимается на nums deque. Затем, когда нажата десятичная кнопка, она выталкивает все nums на новый deque, называемый specialDecimal, и нажимаем кнопку «.». после этих чисел. Также задано логическое значение, которое называется decimalClicked. Итак, теперь у меня есть числа до десятичной + десятичной. Затем, когда оператор нажат, он подталкивает числа в nums, которые являются числами после десятичного знака в specialDecimal. Итак, когда равно нажатие кнопки я сделать специальную оценку для decimalClicked:C++ toDouble() преобразует строку в 0

//special case if decimal is pressed 
double actualVal = 0; 
QString s = ""; 
bool ok; //for toDouble 

if(decimalClicked){ 
    while(!(specialDecimal.empty())){ 
     QString s = specialDecimal.front(); 
     cerr << s.toStdString(); 
     s.append(s); 
     specialDecimal.pop_front(); 
    } 
    cerr << endl << "should be whole string number: " << s.toStdString(); 
    actualVal = s.toDouble(&ok); 
    cerr << endl << "should be value: " << actualVal; 
    nums.push_front(actualVal); 
}` 

Выход для КВЖД является:

8.1 
should be whole string number: 
should be value: 0 

сегга оператор печати внутри время цикла показывает, что она разбор десятичного числа правильно. Операция cerr прямо под циклом while не выводит всю строку. Также отображается результат в основном 0 + the second number, если я делаю оператор +. При необходимости я могу показать больше кода.

+2

Вы, кажется, ожидать, что какой-то темной магии, два вхождения 's' в' s.append (ы) 'относятся к двум различным объектам. Дайте разные имена различным переменным. –

+0

Ничего себе, это сделал трюк. Я думал, что просто добавит к нему свою текущую QString ?? Но спасибо!! –

+1

Да, он добавляет строку, объявленную внутри цикла, к себе; сразу же после того, как в закрывающей скобке цикла эта строка будет уничтожена. Строка, объявленная вне цикла - тот, который вы вызываете 'toStdString', остается пустым. Вся ваша петля эквивалентна 'specialDecimal.clear()'; он ничего не добивается. –

ответ

1

Ошибка является одной из переменных областей.

//special case if decimal is pressed 
double actualVal = 0; 
QString s = ""; // <----------------------- s variable declared in outer scope 
bool ok; //for toDouble 

if(decimalClicked){ 
    while(!(specialDecimal.empty())){ 
     QString s = specialDecimal.front(); // <-- s variable declared in 
              //  while loop scope which 
              //  hides the s variable 
              //  in the outer scope 
     cerr << s.toStdString(); 
     s.append(s); 
     specialDecimal.pop_front(); 
    } // <---------------------------------- second s variable goes out 
     //          of scope   
    cerr << endl << "should be whole string number: " << s.toStdString(); 
    actualVal = s.toDouble(&ok); 
    nums.push_front(actualVal); 
} 

Попробуйте вместо этого:

//special case if decimal is pressed 
double actualVal = 0; 
QString s = ""; 
bool ok; //for toDouble 

if(decimalClicked){ 
    while(!(specialDecimal.empty())){ 
     QString a = specialDecimal.front(); // note variable renamed to avoid 
              // collision 
     cerr << s.toStdString(); 
     s.append(a); 
     specialDecimal.pop_front(); 
    } 
    cerr << endl << "should be whole string number: " << s.toStdString(); 
    actualVal = s.toDouble(&ok); 
    nums.push_front(actualVal); 
}