Alles ist true

Liebes Forum!

Ich kann mir einfach nicht helfen…

if(true)
{
 printf("lol");
}

if(false)
{
 printf("lol");
}

if(0==1)
{
 printf("lol");
}

In allen Fällen wird in der Console lol ausgegeben. Nicht dass mein Programm jetzt lol ausgeben soll, aber mit

 case VK\_LEFT:
 {
 if(this-\>cursorpos \> 0);
 {
 this-\>cursorpos -= 1;
 }
 break;
 }

will ich nur dann den cursor bewegen, wenn cursorpos größer als 0 ist. Der Cursor wird aber IMMER bewegt, egal welchen Wert cursorpos hat.

Ich habe schon an einen Compilerbug gedacht. Weiß jemand wie man an sowas rangehen soll?

Verwende Code::Blocks mit MinGW.

mfg dixxi

Hallo dixxi,

Dein Code erzeugt keine Fehlermeldungen ond/oder Warnungen ?
Grundsätzlich sollte man den Compiler so konfigurieren, dass er ALLE möglichen Warnungen ausgiebt.

Ich habe schon an einen Compilerbug gedacht. Weiß jemand wie
man an sowas rangehen soll?

Die meisten Codebugs entstehen bei der Optimierung des Compilers, also diese mal abschalten.

Am einfachsten schaut man sich an, welcher Assemblercode generiert wird. Um ganz sicher zu gehen, sollte man sich diesen noch mit dem Debugger ansehen.

Verwende Code::Blocks mit MinGW.

Fehlt noch die Angabe des Compilers und dessen Version.

MfG Peter(TOO)

Hallo Peter

Dein Code erzeugt keine Fehlermeldungen ond/oder Warnungen ?
Grundsätzlich sollte man den Compiler so konfigurieren, dass
er ALLE möglichen Warnungen ausgiebt.

Ich habe -Wall standardmäßig eingeschaltet. Jetzt habe ich noch -pedantic dazugeschaltet und erhalte immer noch keine Warnings.

Die meisten Codebugs entstehen bei der Optimierung des
Compilers, also diese mal abschalten.

Im Debugmodus sind alle Optimierungen deaktiviert. Habe hier dasselbe Problem wie im Releasemodus, wo alle Optimierungen aktiviert sind.

Am einfachsten schaut man sich an, welcher Assemblercode
generiert wird.

Weiß ich leider nicht, wie das geht. Hatte ich schon einmal im Internet gesucht, bin aber nicht fündig geworden. Außerdem glaube ich wäre das zu aufwendig. Mein Code hat bereits 3072 Zeilen und die exe ist mit allen Optimierungen schon 80 kb groß.

Um ganz sicher zu gehen, sollte man sich
diesen noch mit dem Debugger ansehen.

Hab ich noch nie verwendet. Wäre nett von dir, wenn du mir den erklären könntest!

Fehlt noch die Angabe des Compilers und dessen Version.

Hab das im Compilerverzeichnis gefunden (readme.txt):

This folder contains the following components:

gcc-core-3.4.5-20060117-1-vista.tar.gz
gcc-g++-3.4.5-20060117-1-vista.tar.gz
mingw-runtime-3.14.tar.gz
mingw32-make-3.81-2.tar.gz
mingw-utils-0.3.tar.gz
w32api-3.11.tar.gz
binutils-2.18.50-20080109.tar.gz
gdb-6.7.50.20071127-mingw.tar.bz2

mfg dixxi

Hallo dixxi,

gcc V3.4.5 scheint schon etwas älter zu sein.
Wie wäre es mit einem Update (Aktuell ist etwas um 4.5.xx).

MfG Peter(TOO)

Hallo Peter

gcc V3.4.5 scheint schon etwas älter zu sein.
Wie wäre es mit einem Update (Aktuell ist etwas um 4.5.xx).

Das Update hat leider auch nichts geholfen. Das Problem besteht weiterhin. Ich hätte dan schon probiert mit dem MS Compiler zu compilieren, aber der bringt dan zigtausend Errors im gl.h.

Andere Frage. Gibt es nicht ein Schlüsselwort für Variablen, das eine Optimierung an einer gewissen Stelle verhindert bzw. verhindert, dass Werte bei der Codeoptimierung in CPU-Register abgelegt werden anstatt zweimal aus dem Speicher gelesen zu werden? Hab ich einmal in einem Artikel über Deadlocks gelesen.

mfg dixxi

Gelöst
Ich bin so ein Iditot!

Hab den Fehler gefunden:

 if(this-\>cursorpos text.Length());
 {
 this-\>cursorpos += 1;
 }

Das Semikolon nach der if war der Fehler. Die if wurde zwar richtig ausgewertet, aber das war für den Anweisungsblock ja egal, da sich die if nur auf die Ausführung von ; bezieht. Somit wurde

 {
 this-\>cursorpos += 1;
 }

immer ausgeführt.

mfg dixxi

Hallo Dixxi

Ich bin so ein Iditot!

Glaube ich nicht: dann hättest Du den Fehler jetzt auch nicht gefunden. Ich habe ihn vorhin übrigens genauso übersehen, :wink:

if(this->cursorpos text.Length());
{
this->cursorpos += 1;
}

Das Semikolon nach der if war der Fehler.

MingW findet nicht jeden Fehler. Ich habe auch beide, aber lasse alles auch mit VC6 durchlaufen, der hätte dieses ; gleich bei der Nase genommen. Ich hatte erst kürzlich sowas drin:

if (/\* xxx \*/) {
 /\* xxxxxxxxxxxx \*/
};

Das hatte MingW ebenso übersehen.

lG
Martin B