Solved Scelta del contenitore
-
Buon giorno avrei bisogno di sapere quale contenitore sarebbe utile per un'analisi che devo fare: ho un file csv diviso in due colonne. La prima mi indica con 1 quando è stato attivato il motore e 0 quando è stato spento. Per ciascuno dei due eventi sono stati registrati la data e l'ora in cui è avvenuta quell'evento. Io devo poter calcolare il tempo complessivo in cui il motore ha funzionato, sommando le differenze di tempo tra l'evento 0 e l'evento 1 che appunto rappresenta questo tempo. Potete darmi un suggerimento
-
struct StatoMotore{ bool acceso; QDateTime dataOra; StatoMotore() :acceso(false) {} StatoMotore(bool acc, const QDateTime& d_o) :acceso(acc) ,dataOra(d_o) {} StatoMotore(const StatoMotore& other) = default; StatoMotore& operator=(const StatoMotore& other) = default; }; QVector<StatoMotore> listaStati; QFile fileDati("dati.csv"); fileDati.open(QFile::ReadOnly); QTextStream lettore(&fileDati); QString linea; while (stream.readLineInto(&line)) { const QVector<QStringRef> parti = linea.splitRef(QLatin1Char(','),Qt::SkipEmptyParts); listaStati.append(StatoMotore(parti.at(0).toInt()==1, QDateTime::fromString(parti.at(1).toString(),QStringLiteral("dd/MM/yyyy hh:mm:ss")))); } std::sort(listaStati.begin(),listaStati.end(),[](const StatoMotore& a,const StatoMotore& b)->bool{return a.dataOra<b.dataOra;}); qint64 secAcceso=0; auto i=listaStati.cbegin(); bool era_acceso=i->acceso; const auto iEnd=listaStati.cend(); for(auto iPrev=i++;i!=iEnd;++i, ++iPrev){ if(!i->acceso && era_acceso) secAcceso += iPrev->dataOra.msecsTo(i->dataOra)/static_cast<qint64>(1000); era_acceso=i->acceso; } qDebug() << "Il motore e' stato acceso per " << secAcceso << " secondi";
Potresti anche usare
std::pair<bool,QDateTime>
invece diStatoMotore
ma di solito preferisco l'approccio "custom struct" -
Perfetto provo e poi ti do conferma per il forum
-
Ciao allora ho provato a fare un oggetto anzichè una struct perchè magari potrei rielaborarlo per altri elementi. L'unica cosa che non riesco a capire è se ho sbagliato il costruttore, perchè i dati non vengono mi sembrano vengano memorizzati nel vettore. Soprattutto l'elemento QDateTime, perchè mi risulta vuoto.
Per cui penso di aver sbagliato qualcosa.#include "analizeobj.h" Analizeobj::Analizeobj() { event=""; registration= QDateTime::fromString("01/01/1900 00:00", "dd/MM/YYYY hh:mm"); } Analizeobj::Analizeobj(QString mEvent, QDateTime mRegistration) { Analizeobj::setEvent(mEvent); Analizeobj::setRegistration(mRegistration); } QString Analizeobj::getEvent() { return event; } QDateTime Analizeobj::getRegistrazion() { return registration; } void Analizeobj::setEvent(QString mEvent) { if (mEvent != event) { event = mEvent; } else return; } void Analizeobj::setRegistration(QDateTime mRegistration) { if (mRegistration != registration) { registration = mRegistration; } } #include <QDateTime> class Analizeobj { public: Analizeobj(); Analizeobj(QString mEvent, QDateTime mRegistration); QString getEvent(); QDateTime getRegistrazion(); void setEvent(QString); void setRegistration(QDateTime); private: QString event; QDateTime registration; }; #endif // ANALIZEOBJ_H
e questo è il comando che ho usato per inserire i dati nel nel vettore
datogrezzo.append(Analizeobj(parti.at(0).toString(),QDateTime::fromString(parti.at(1).toString(),QStringLiteral("dd/MM/YYYY hh:mm"))));
-
Visto l'errore
Nel formato dell'anno ho usato "YYYY" anzichè "yyyy".
Adesso funziona tutto , grazie davvero