seltsamer Fehler bei Deklaration einer int-Variable

vfl_freak

Premium-User
Hallo zusammen,

ich hänge gerade an einem ganz kuriosen Problem :

Ich deklariere eine Variable "iAnz" und weise ihr dabei gleich den Wert einer anderen Integer-Variablen zu.
Diese Variable wird dann innerhalb einer while-Schleife benutzt.

Wie man im jedoch im Anhang sieht (Ausschnitt bei Debuggen) hat iAnz zu Beginn der Schleife stumpf den Wert "0" - und nicht "136", wie erwartet!

Ich habe schon das gesamte Projekt komplett neu erstellen lassen, aber das ändert nix ....

Hat jemand eine Idee, was das für eine Sch.... ist :confused:

Danke und Gruß
Klaus
 

Anhänge

  • Zuweisungserror.jpg
    Zuweisungserror.jpg
    428,7 KB · Aufrufe: 21

deepthroat

Erfahrenes Mitglied
Hi.

Hast du denn mit Optimierungen kompiliert? Das kann den Debugger manchmal etwas durcheinander bringen (loop unrolling evtl?).

Wird denn dann trotzdem in die Schleife reingegangen? Bzw. funktioniert die Suche denn nicht?

Gruß
 

vfl_freak

Premium-User
Hi deepthroat,

Hast du denn mit Optimierungen kompiliert? Das kann den Debugger manchmal etwas durcheinander bringen (loop unrolling evtl?).
Wird denn dann trotzdem in die Schleife reingegangen? Bzw. funktioniert die Suche denn nicht?

Nein, Optimierung ist deaktiviert (/0d) ....

Nein, die Schleife wird auch nicht durchlaufen, wodurch einiges was danach passiert, durch die fehlerhafte Berechnung von "nRowCount" durcheinander kommt.
Seltsamerweise fiel das Ganze in der Releaseversion vor ca. 2 - 3 Std. auf, ohne dass ich in diesem Bereich des Code etwas geändert hatte ...

Ich habe inzwischen noch eine zweite Stelle entdeckt, an der ähnliches passiert :
C++:
for( int k = 0; k < iZaehler; k++ )
{
...
Auch diese Schleife wird nicht durch laufen, obwohl mir der Debugger für "iZaehler" den Wert 136 anzeigt ....

Gruß
Klaus

edit: das Ganze wird noch lustiger .... :suspekt:

Ich habe jetzt mal die Schleife direkt mit iZaehler aufgerufen (warum auch extra zuweisen).
Obwohl der Wert lt. Debugger wiederum 136 ist (siehe Anhang), geht das Programm NICHT in die Schleife ..... :-(

Gruß
Klaus
 

Anhänge

  • error-2.jpg
    error-2.jpg
    464,2 KB · Aufrufe: 11
Zuletzt bearbeitet von einem Moderator:

vfl_freak

Premium-User
Junge, junge ... hab' den Fehler gefunden - das war ganz böse :rolleyes:

Folgende Änderung an der ersten for-Schleife war entscheidend:

Die Deklaration der beiden Variablen "nColCounter" und "iZaehler" ist im Zuge der Umstellung von VS6 auf VS2010 VOR die Schleife gezogen.
Also muss es jetzt statt :
C++:
		int nColCounter = 0;
		int iZaehler = 0;
		for( int i = 0, nColCounter = 0, iZaehler = 0; i < nTextLaenge; i ++)
		{

so lauten :
C++:
		int nColCounter = 0;
		int iZaehler = 0;
		for( int i = 0; i < nTextLaenge; i ++)
		{

Irgendwie geht sonst wohl der Speicher über die Wupper :eek:

Na ja, dann kann ich ja wenigstens beruhigt ins WE gehen!

Nochmals Danke und tschüss
Klaus
 
Zuletzt bearbeitet von einem Moderator:

deepthroat

Erfahrenes Mitglied
Junge, junge ... hab' den Fehler gefunden - das war ganz böse :rolleyes:

Folgende Änderung an der ersten for-Schleife war entscheidend:

Die Deklaration der beiden Variablen "nColCounter" und "iZaehler" ist im Zuge der Umstellung von VS6 auf VS2010 VOR die Schleife gezogen.
Also muss es jetzt statt :
C++:
		int nColCounter = 0;
		int iZaehler = 0;
		for( int i = 0, nColCounter = 0, iZaehler = 0; i < nTextLaenge; i ++)
		{

so lauten :
C++:
		int nColCounter = 0;
		int iZaehler = 0;
		for( int i = 0; i < nTextLaenge; i ++)
		{

Irgendwie geht sonst wohl der Speicher über die Wupper :eek:
Das ist natürlich Unfug. Da passiert nichts mit dem Speicher.

Du hast einfach innerhalb der Schleife eine neue Variable namens iZaehler definiert welche die Variable vor der Schleife überlagert. Ganz normales C++.

Gruß
 
Zuletzt bearbeitet von einem Moderator:

vfl_freak

Premium-User
Hi deepthroat,

Das ist natürlich Unfug. Da passiert nichts mit dem Speicher.
Du hast einfach innerhalb der Schleife eine neue Variable namens iZaehler definiert welche die Variable vor der Schleife überlagert. Ganz normales C++.

Hmm, aber wieso sollte die Variable VOR der Schleife überlagert werden ?

Ich habe im Rahmen der Umstellung etliche Stellen wie diese umbauen müssen :
C++:
if( int i = 0; i < 10; i++ )
{
// ...
}
i += 42;  <-- hier meckerte der Compiler jedesmal, das 'i' nicht deklariert ist !!

Klingt für mich so, dass hier das 'i' nur einen Gültigkeitsbereich innerhalb der for-Schleife hat, oder ?

Warum beeinflusst also im Beispiel oben die neue Variable 'iZahler' aus dem Kopf der Schleife den zuvor deklarierte Variable ****

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:

deepthroat

Erfahrenes Mitglied
Hi.
Hmm, aber wieso sollte die Variable VOR der Schleife überlagert werden ?

Ich habe im Rahmen der Umstellung etliche Stellen wie diese umbauen müssen :
C++:
if( int i = 0; i < 10; i++ )
{
// ...
}
i += 42;  <-- hier meckerte der Compiler jedesmal, das 'i' nicht deklariert ist !!
Ja, das ist auch völlig korrekt so. (das Gemecker)
Klingt für mich so, dass hier das 'i' nur einen Gültigkeitsbereich innerhalb der for-Schleife hat, oder ?
Ja, allerdings => C++ Standard (klingelt da was? ;))
Warum beeinflusst also im Beispiel oben die neue Variable 'iZahler' aus dem Kopf der Schleife den zuvor deklarierte Variable ****
Das sind nunmal die C++ Regeln.

C++:
int foo = -33;
{
  int foo = 5; // überlagert foo in äußerem Skopus
  {
     int foo = 36;  // überlagert foo in äußerem Skopus
  }
}
cout << foo; // druckt -33
for (int foo = 3, i = 0; i < 5; ++) {
  cout << foo; // druckt 3
}
cout << foo; // druckt immer noch -33
Gruß
 
Zuletzt bearbeitet von einem Moderator:

vfl_freak

Premium-User
Hi,

Ja, das ist auch völlig korrekt so. (das Gemecker)
ja ja, schon klar :)

aber ....

C++:
int foo = -33;
cout << foo; // druckt -33

for (int foo = 3, i = 0; i < 5; ++) 
{
  cout << foo; // druckt 3
}
cout << foo; // druckt immer noch -33
Eben - das war ja auch genau das, was ich erwartet habe, was aber bei meinem Fehler nicht so war !
Nach der for-Schleife zeigte mir der Debugger den erwarteten Wert von "iZaehler" an, nur warum lies er sich dann nicht auf "iAnz" zuweisen resp. im Kopf der while-Schleife verwenden?
Verstehe ich jetzt nicht so ganz ....

EDIT:
oder andersrum gefragt: wenn in dem Moment "iZaehler" noch '0' war, wieso zeigte mir der Debugger dann den scheinbar richtigen Wert an ? ? ?

Gruß
Klaus
 

deepthroat

Erfahrenes Mitglied
Eben - das war ja auch genau das, was ich erwartet habe, was aber bei meinem Fehler nicht so war !
Dann zeig doch mal deinen Code.
Nach der for-Schleife zeigte mir der Debugger den erwarteten Wert von "iZaehler" an, nur warum lies er sich dann nicht auf "iAnz" zuweisen resp. im Kopf der while-Schleife verwenden?

Verstehe ich jetzt nicht so ganz ....

EDIT:
oder andersrum gefragt: wenn in dem Moment "iZaehler" noch '0' war, wieso zeigte mir der Debugger dann den scheinbar richtigen Wert an ? ? ?
Achtung, Blasphemie: ein Fehler im Debugger? :eek:

Evlt. hast du einfach die falsche Variable inspiziert? Wenn die den gleichen Namen haben sind die nur schwer auseinander zu halten. Adresse der Variablen wäre interessant gewesen.

Gruß
 

vfl_freak

Premium-User
Moin,

Achtung, Blasphemie: ein Fehler im Debugger? :eek:

Evlt. hast du einfach die falsche Variable inspiziert?
Wenn die den gleichen Namen haben sind die nur schwer auseinander zu halten. Adresse der Variablen wäre interessant gewesen.

Möglicherweise ... :rolleyes:

Nun ja, das Problem ist ja erkannt und gelöst, so dass ich mich erstmal mit anderen Dingen beschäftigen muss !

Danke und Gruß
Klaus