Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Wer verändert da meinen Variablenwert? (erledigt) (https://www.delphipraxis.net/91482-%5Bc-%5D-wer-veraendert-da-meinen-variablenwert-erledigt.html)

Matze 5. Mai 2007 16:38


[C++] Wer verändert da meinen Variablenwert? (erledigt)
 
Hi,

ich habe noch eine Frage zu C/C++. ;)

Es geht um eine Klasse, das Relevante ist dies hier:

cl_snake.h:

Code:
class cl_snake
{
   public:
      cl_snake(void);
   public:
      ~cl_snake(void);
   public:
      int colors[2];
      int field_size, field_width, field_height;
cl_snake.cpp:

Code:
// constructor
cl_snake::cl_snake(void)
{
   colors[2] = 4;
   field_size = 10;

   printf("Foo: %d ", colors[2]);
}
Nun ratet mal, was mir ausgegeben wird. Ich sag's euch: 10 :shock: Es wird immer der Wert von field_size ausgegeben, bis ich da mal draufgekommen bin, das hat mich nun Stunden gekostet. :wall:

Was ist da denn los? Zwischendrin verändere ich ja keine Variablen und mit Pointern arbeite ich auch nicht direkt.

Verwirrt grüßt
Matze

Edit: Ich glaub ich hab's, das Array geht von 0 bis 1, mal testen. :wall: :wall: :wall:
Edit 2: ja das war's, oh Mann!
Edit 3: Aber ich verstehe dennoch nicht, wieso colors[2] den Wert der darauffolgenden Variablen enthält. Kann mir das jemand erklären?

ZiMD 5. Mai 2007 16:54

Re: [C++] Wer verändert da meinen Variablenwert? (erledigt)
 
Weil die Variable vermutlich so auf dem Stack liegen:
[...]
colors[0]
colors[1]
field_size
field_width
field_height
[...]

Matze 5. Mai 2007 17:03

Re: [C++] Wer verändert da meinen Variablenwert? (erledigt)
 
Ja, das könnte sein, was mich aber wundert ist, dass der Index eines Arrays, den es nicht gibt, dann auf die nächste Speicheradresse zeigt und nicht irgendein Fehler kommt wie in Delphi. Aber vermutlich wird das so sein.

3_of_8 5. Mai 2007 17:10

Re: [C++] Wer verändert da meinen Variablenwert? (erledigt)
 
In Assembler sieht das ungefähr so aus, dass ein Array-Index als Displacement gesehen wird, das heißt, ein Array-Index wird mit der Größe eines einzelnen Feldes (hier 4 Byte) multipliziert und als Displacement zum 0. Element betrachtet. Also ist das 2. Array-Element in diesem Fall das, was 2*4 Byte=8 Byte hinter dem 0. Element liegt, und das ist nunmal zufällig dein int field_size.

EDIT: Delphi zeigt übrigens das gleiche Verhalten bei deaktivierten Range-Checks, aber nur, wenn der Index erst zur Laufzeit feststeht. Ansonsten beschwert sich der Compiler sofort. In C/C++ beschwert er sich nicht, weil dieser Effekt teilweise sogar ganz nützlich sein kann, etwa, wenn man ein Dateiformat einliest.

Christian Seehase 5. Mai 2007 17:10

Re: [C++] Wer verändert da meinen Variablenwert? (erledigt)
 
Moin Matthias,

es wird wohl kein Fehler angezeigt, wenn Du nicht angibst, das auf solche Fehler geprüft werden soll.

Matze 5. Mai 2007 17:16

Re: [C++] Wer verändert da meinen Variablenwert? (erledigt)
 
@Manuel: Ach so ist das, danke.
@Chris: Ja stimmt, ich habe jedoch die Standard-Compilereinstellungen belassen und da ist das wohl deaktiviert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz