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
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. ^^