Solved uninitialized switchcase error
-
this is my function.
void coreaction::batteryCheck() { if (sm.getShowBattery()) { UPower *u = new UPower(this); Battery *b; foreach (Battery *bat, *u->batteries()) { b = u->batteries()->value(bat->path()); } ui->batteryProg->setValue(b->percentage()); switch( b->state() ) { case Battery::FullyCharged: ui->batteryStatus->setText( tr( "Full" ) ); break; case Battery::Discharging: ui->batteryStatus->setText( tr( "Discharging" ) ); break; case Battery::Charging: ui->batteryStatus->setText( tr( "Charging" ) ); break; default: ui->batteryStatus->setText( tr( "No Battery" ) ); break; } ui->batteryframe->setVisible(true); } else { ui->batteryframe->setVisible(false); } }
battery.h
#ifndef BATTERY_H #define BATTERY_H #include <QObject> class QDBusInterface; class Battery : public QObject { Q_OBJECT Q_ENUMS(State) Q_PROPERTY(QString sysfsPath READ sysfsPath STORED false) Q_PROPERTY(QString model READ model STORED false) Q_PROPERTY(QString vendor READ vendor STORED false) Q_PROPERTY(QString technology READ technology STORED false) Q_PROPERTY(QString path READ path STORED false) Q_PROPERTY(bool powerSupply READ powerSupply STORED false) Q_PROPERTY(bool hasHistory READ hasHistory STORED false) Q_PROPERTY(bool hasStatistics READ hasStatistics STORED false) Q_PROPERTY(bool isPresent READ isPresent STORED false) Q_PROPERTY(bool isRechargeable READ isRechargeable STORED false) Q_PROPERTY(double energy READ energy STORED false) Q_PROPERTY(double energyEmpty READ energyEmpty STORED false) Q_PROPERTY(double energyFull READ energyFull STORED false) Q_PROPERTY(double energyFullDesign READ energyFullDesign STORED false) Q_PROPERTY(double energyRate READ energyRate STORED false) Q_PROPERTY(double voltage READ voltage STORED false) Q_PROPERTY(double percentage READ percentage STORED false) Q_PROPERTY(double capacity READ capacity STORED false) Q_PROPERTY(State state READ state STORED false) Q_PROPERTY(int lowLevel READ lowLevel) Q_PROPERTY(double toFull READ toFull STORED false) Q_PROPERTY(double toEmpty READ toFull STORED false) public: Battery(const QString & path, QObject *parent = 0); ~Battery(); /* Enums */ enum State {FullyCharged, Charging, Discharging}; /* Properties */ QString sysfsPath() const; QString model() const; QString vendor() const; QString technology() const; const QString & path() const; bool powerSupply() const; bool hasHistory() const; bool hasStatistics() const; bool isPresent() const; bool isRechargeable() const; bool isValid() const; double energy() const; double energyEmpty() const; double energyFull() const; double energyFullDesign() const; double energyRate() const; double voltage() const; double percentage() const; double capacity() const; double toFull() const; double toEmpty() const; int lowLevel() const; void setLowLevel(int value); Battery::State state() const; private: void createInterface(); QDBusInterface *m_interface; QString m_path; bool m_hasAlreadyBeenLow; bool m_hasAlreadyBeenFull; int m_lowLevel; bool m_valid; public Q_SLOTS: void refresh(); private Q_SLOTS: void update(); Q_SIGNALS: void changed(); void low(); void full(); };
this is battery.cpp
#include "battery.h" #include <QtDBus/QDBusConnection> #include <QtDBus/QDBusInterface> #include <QSettings> Battery::Battery(const QString &path, QObject *parent) : QObject(parent), m_interface(0), m_path(path), m_hasAlreadyBeenLow(false), m_hasAlreadyBeenFull(false), m_valid(false) { createInterface(); } Battery::~Battery() { } void Battery::createInterface() { if(m_interface==0 || !m_interface->isValid()) { m_interface = new QDBusInterface("org.freedesktop.UPower", m_path, "org.freedesktop.UPower.Device", QDBusConnection::systemBus(), this); connect(m_interface, SIGNAL(Changed()), this, SIGNAL(changed())); if(!m_interface->isValid()) { delete m_interface; m_interface = 0; m_valid = false; return; } } m_valid = true; } void Battery::refresh() { m_interface->call("Refresh"); } void Battery::update() { int level = percentage(); if(level<lowLevel()) { if(!m_hasAlreadyBeenLow) { m_hasAlreadyBeenLow = true; emit low(); } } else { m_hasAlreadyBeenLow = false; } if(state() == FullyCharged) { if(!m_hasAlreadyBeenFull) { m_hasAlreadyBeenFull = true; emit full(); } } else { m_hasAlreadyBeenFull = false; } } bool Battery::isValid() const { return m_interface->property("Type").toInt() == 2 && m_valid; } int Battery::lowLevel() const { QSettings settings; settings.beginGroup("Batteries_Low_Level"); int lvl = settings.value(m_path, 20).toInt(); settings.endGroup(); return lvl; } void Battery::setLowLevel(int value) { QSettings settings; settings.beginGroup("Batteries_Low_Level"); settings.setValue(m_path, value); settings.endGroup(); } QString Battery::sysfsPath() const { return m_interface->property("NativePath").toString(); } QString Battery::model() const { return m_interface->property("Model").toString(); } QString Battery::vendor() const { return m_interface->property("Vendor").toString(); } QString Battery::technology() const { return m_interface->property("Technology").toString(); } const QString & Battery::path() const { return m_path; } bool Battery::powerSupply() const { return m_interface->property("PowerSupply").toBool(); } bool Battery::hasHistory() const { return m_interface->property("HasHistory").toBool(); } bool Battery::hasStatistics() const { return m_interface->property("HasStatistics").toBool(); } bool Battery::isPresent() const { return m_interface->property("IsPresent").toBool(); } bool Battery::isRechargeable() const { return m_interface->property("IsRechargeable").toBool(); } double Battery::energy() const { return m_interface->property("Energy").toDouble(); } double Battery::energyEmpty() const { return m_interface->property("EnergyEmpty").toDouble(); } double Battery::energyFull() const { return m_interface->property("EnergyFull").toDouble(); } double Battery::energyFullDesign() const { return m_interface->property("EnergyFullDesign").toDouble(); } double Battery::energyRate() const { return m_interface->property("EnergyRate").toDouble(); } double Battery::voltage() const { return m_interface->property("Voltage").toDouble(); } double Battery::percentage() const { return m_interface->property("Percentage").toDouble(); } double Battery::capacity() const { return m_interface->property("Capacity").toDouble(); } double Battery::toEmpty() const { return m_interface->property("TimeToEmpty").toDouble(); } double Battery::toFull() const { return m_interface->property("TimeToFull").toDouble(); } Battery::State Battery::state() const { uint state = m_interface->property("State").toUInt(); switch( state ) { case (uint) 0: return FullyCharged; break; case (uint) 1: return Charging; break; case (uint) 2: return Discharging; break; default: return FullyCharged; break; } }
problem is when i compile i got this error
g++ -c -pipe -O2 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -O2 -pipe -fstack-protector-strong -fno-plt -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_PRINTSUPPORT_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_CHARTS_LIB -DQT_WIDGETS_LIB -DQT_MULTIMEDIA_LIB -DQT_GUI_LIB -DQT_DBUS_LIB -DQT_NETWORK_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt -isystem /usr/include/qt/QtPrintSupport -isystem /usr/include/qt/QtMultimediaWidgets -isystem /usr/include/qt/QtCharts -isystem /usr/include/qt/QtWidgets -isystem /usr/include/qt/QtMultimedia -isystem /usr/include/qt/QtGui -isystem /usr/include/qt/QtDBus -isystem /usr/include/qt/QtNetwork -isystem /usr/include/qt/QtConcurrent -isystem /usr/include/qt/QtCore -I. -isystem /usr/include/libdrm -I. -I/usr/lib/qt/mkspecs/linux-g++ -o mimeutils.o corefm/mimeutils.cpp make: *** [Makefile:2028: corebox.o] Error 1 make: *** Waiting for unfinished jobs.... coreaction/coreaction.cpp: In member function 'void coreaction::batteryCheck()': coreaction/coreaction.cpp:114:25: warning: 'b' may be used uninitialized in this function [-Wmaybe-uninitialized] switch( b->state() ) { ~~~~~~~~^~ ==> ERROR: A failure occurred in build(). Aborting...
what i missing??
-
@saber Take a look at this code:
Battery *b; foreach (Battery *bat, *u->batteries()) { b = u->batteries()->value(bat->path()); }
If u->batteries() returns an empty list b will be a dangling pointer and your app will crash. That's what compiler is telling you.
To be honest I don't understand this code: why do you iterate in a loop over the whole list but only keep the last value in b? It would be way faster to directly access the last element. -
please can u show the right way to do this .
please .
it is done by my friend and he is not in touch .
i need the fix badly. -
@saber This is really not difficult:
Battery *b = nullptr; foreach (Battery *bat, *u->batteries()) { b = u->batteries()->value(bat->path()); } if (!b) return;
-