2015-07-15 5 views
0

у меня есть проблемы с чтением моих данные карт или, возможно, даже писать его.Не может прочитать мои данные карты

приложение я делаю это основным конвертер валют.

Загружаем обменные курсы с веб-сайта, сохраняем его в txt-файле, который затем обрабатывает, чтобы сохранить значения на карте и использовать мой класс калькулятора для преобразования.

класс загрузчика работает безупречно (я получил его из официальных форумов QT), поэтому я не буду публиковать его, так как проблема не существует.

код: main.cpp

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QMap<QString,double> currency_map; 

    downloader d; 
    d.Do_download(); 

    parser p; 
    p.read_line(currency_map); 

    p.print_map(currency_map);// this line works, and it prints out the map 

    MainWindow w(currency_map); 
    w.show(); 

    return a.exec(); 
}; 

parser.cpp им вполне уверен, что он хорошо работает, потому что print_map функция выполняет свою работу.

void parser::process_line(QString line, QMap<QString, double> &my_map) 
{ 

    QStringList temporary_list; 

    for(int i = 0; i< currency_list.size();i++) 
     { 
     if(line.contains(currency_list.at(i),Qt::CaseInsensitive)) 
      { 

      temporary_list=line.split(" ",QString::SkipEmptyParts); 

      temporary_list.replaceInStrings(",","."); 
      my_map.insert(currency_list.at(i),temporary_list[6].toDouble()); 
     } 
    } 

} 

int parser::read_line(QMap<QString, double> &my_map) 
{ 

    QFile file("C:/Qt/test/downloaded.txt"); 

    if(!file.exists()) 
     { 
     QMessageBox msgBox; 
     msgBox.setText("There is no such file"); 
     msgBox.exec(); 
     return 1; 
    }  
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
    { 
     QMessageBox msgBox; 
     msgBox.setText("Error while opening file"); 
     msgBox.exec(); 
     return 1; 
    } 

    QTextStream in_stream(&file); 
    QString line=in_stream.readLine(); 

    while (!line.isNull()) 
     { 
     process_line(line, my_map); 
     line = in_stream.readLine(); 
    } 
    return 0; 
} 

void parser::print_map(QMap<QString, double> &my_map) 
{ 
    QMapIterator<QString, double> i(my_map); 
    while(i.hasNext()) 
     { 
     i.next(); 
     qDebug()<< i.key() << ": " << i.value(); 
    } 
} 

теперь у меня есть класс калькулятора:

.h

class Calculator 
{ 
public: 
    explicit Calculator(QMap<QString,double> &currency_map); 
    void multiply(); 
    void getValues(QString strFrom, QString strTo); 
    double getTotal(); 
private: 
    double total, firstCurr, secondCurr; 
    QMap<QString,double> &map; 

}; 

.cpp

#include "calculator.h" 

Calculator::Calculator(QMap<QString,double> &currency_map):map(currency_map) 
{ 
    total = 0; 
    firstCurr = 0; 
    secondCurr= 0; 
} 

void Calculator::getValues(QString strFrom, QString strTo) 
{ 
    QMap<QString, double>::iterator i; 
    for(i=map.begin();i!=map.end();i++) 
     { 

      if(!i.key().compare(strFrom)) 
       firstCurr=i.value(); 
      if(!i.key().compare(strTo)) 
       secondCurr = i.value(); 
    } 
     //firstCurr = 2; 
     //secondCurr = 3; 
} 

void Calculator::multiply() 
{ 
    total = firstCurr * secondCurr; 
} 

double Calculator::getTotal() 
{ 
    return total; 
} 

тогда я создать объект Калькулятор в моем классе MainWindow .h

class MainWindow : public QMainWindow 
    { 
     Q_OBJECT 

    public: 
     explicit MainWindow(QMap<QString,double> &currency_map, QWidget *parent = 0); 

     ~MainWindow(); 


    private slots: 
     void on_convert_button_clicked(); 

    private: 
     Ui::MainWindow *ui; 
     Calculator calc; 

    }; 

.cpp

MainWindow::MainWindow(QMap<QString, double> &currency_map, QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow),calc(currency_map) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_convert_button_clicked() 
{ 
    calc.getValues(ui->from_Combox->currentText(),ui->to_Combox->currentText()); 
    calc.multiply(); 
    ui->lcdNumber->display(calc.getTotal()); 
} 

, но я не могу показаться, чтобы получить какое-либо значение из карты. странная вещь также, когда я отлаживаю (я использую визуальную студию), она всегда показывает карту как пустую, которую я не могу понять, поскольку работает функция печати.

любая помощь будет оценена. thx

+0

У меня возникло ощущение, что проблема может возникнуть при создании экземпляра calc; вы можете попробовать объявить calc как указатель и построить его в свой конструктор MainWindow с помощью параметра & currency_map, поэтому что-то вроде calc = new Calculator (currency_map) – Marco

+0

, ничего не изменилось. – user3219947

+0

Можете ли вы попытаться сделать объявление карты в классе калькулятора не ссылкой? – Harry

ответ

0

Ваш калькулятор имеет переменную-член, которая является ссылкой на QMap значений валюты. Если значение QMap ссылается на него, то ссылка становится недействительной. Измените объявление переменной-члена в классе калькулятор это:

QMap<QString,double> map; 

Это скопирует карту вместо того, чтобы сделать ссылку на него. Я также поставил бы точку останова в конструкторе калькулятора и проверил бы, что на карте все еще есть достоверные данные в этой точке.

+0

Хорошо, я понимаю первую часть. Но забавная часть, если я поставил точку останова в моем главном после того, как позвоню p.read_line (currency_map), перед тем, как распечатать свою карту , отладчик дает мне [ключ] (ошибка), [значение] 0 , но мои функции печати печатают «AUD»: 5.13678 и еще 11 строк разных примеров. , и это ослепило меня, потому что я не знаю, откуда он получает данные, если отладчик говорит, что карта пуста. – user3219947

+0

Это странно. Затем я попробую выполнить однократное выполнение цикла 'for' в вашей функции« Калькулятор :: getValues ​​». Убедитесь, что входные строки правильно совпадают с ключевыми значениями на карте. Кроме того, я никогда не использовал Visual Studio в качестве среды IDE для Qt-программ. Я бы подумал о том, что отладчик не будет надлежащим образом захватывать данные отладки. Попробуйте сделать фиктивную карту в своей основной функции и заполнить ее произвольными значениями, а затем посмотреть, правильно ли отладчик сообщает о ее содержании. – Carlton

Смежные вопросы