Seite 1 von 1

Zahlen werden auf Konsole nicht korrekt dargestellt

Verfasst: 19. November 2010 23:43
von pinki
N'Abend!
Wenn ich eine Zahl aus einem int auf der Konsole ausgeben möchte (egal, ob std::cout oder qDebug()), dann wird immer nur ein zweizeiliger Kasten mit z.B. 0003 ausgegeben. Wenn die Zahl direkt eingegeben wird und nicht aus einer Variable stammt, wird sie korrekt ausgegeben.

Was mache ich falsch?


Gruß
Michael

Verfasst: 20. November 2010 00:36
von kater
Das klingt als würd ich dirs nicht glauben. Mach mal ein Beispiel mit Quelltext.

Verfasst: 20. November 2010 05:17
von pinki
Hmmm...
Irgendwie scheint das ein Nebeneffekt meiner Loggerklasse zu sein, an der ich gerade bastel. Ich finde den Fehler aber leider nicht. :(

Was auch seltsam ist: Mit GUI kann ich den Logger benutzen, ohne nicht. o_O


Seht ihr mehr?

Quelltext ist im Anhang.


Gruß
pinki

Verfasst: 20. November 2010 08:41
von franzf
Warum müssen immer alle C++ wie Java programmieren...
Man kommt sehr gut ohne Zeiger und new aus. Ich hab jetzt nur das geändert, und schon krieg ich keine SegFaults mehr...

Code: Alles auswählen

class Logger : public QObject{
    private:
        static Logger *instance;
        int           debugLevel;
        QFile         logFile;
        QDateTime     zeit;
        QDate         lastLog;

        Logger(int = 0);

    public:
        static Logger* getInstance();
        void log(QString, int);
        char getDebugLevel();
        void setDebugLevel(int);
};

Code: Alles auswählen

Logger::Logger(int debugLvl) 
 : debugLevel(debugLvl),
   logFile("log/" + QDate::currentDate().toString("dd-MM-yyyy") + ".log"),
   lastLog(QDate::currentDate())
{
}
Mach mal so weiter, und schau obs besser wird. Ich kann mir vorstellen, dass du irgendwas böses mit deinem Speicher getrieben hast, ich geh dem aber nimmer nach, da die ganzen Zeiger eh raus müssen.

Verfasst: 20. November 2010 09:46
von franzf
Erm...

Code: Alles auswählen

Logger::Logger(int debugLvl = 0){
    this->debugLevel = debugLvl;
    this->zeit = new QDateTime();
    *this->lastLog = zeit->date().currentDate(); /// 111!!!11!!! BÖSE!
    this->logFile = new QFile("log/" + zeit->date().currentDate().toString("dd-MM-yyyy") + ".log");
}
Schau dir die Markierte Zeile an. lastLog ist UNINITIALISIERT! Du weist diesem unintialisierten Speicherbereich nun etwas zu. Das geht sowas von in die Hose! lastLog zeigt irgendwo hin. Wenn du dann dort einfach Speicher überschreibst mit deiner Zuweisung, kann alles passieren. Undefiniertes Verhalten. Sogar dein Rechner kann implodieren :P

Darum: Lass die Zeiger bleiben, wenn du sie nicht wirklich brauchst!

Verfasst: 20. November 2010 14:21
von pinki
Moin moin!
Danke für die schnellen Antworten.
franzf hat geschrieben:Warum müssen immer alle C++ wie Java programmieren...
Das kommt davon, wenn man vorher nur C++ gemacht hat und nun im Studium nur Java.
Die Umstellung geht bei mir da noch nicht so leicht von der Hand. ^^


Ich habe das jetzt - mit Ausnahme von instance - wie vorgeschlagen zeigerlos gemacht.
Den Konstruktor habe ich auch übernommen. Danke noch mal. :)

Die uninitialisierte Stelle war mir gar nicht aufgefallen. *mir vor den Kopf klatsch*

Die SegFaults sind jetzt weg, das Problem mit der Konsole habe ich aber leider immer noch. :(

Hab viel rumprobiert und letztenendes sogar Qt noch mal in der neusten Version heruntergeladen und kompiliert. Gebracht hat auch das nichts.

Im Anhang ist nun die überarbeitete Version.


Gruß
Michael


Edit: Och nöööö! Wie dumm! Die arg-Methode von QString sollte ich vielleicht auch beachten. Ihr dürft mich nun steinigen. ^^