Stack around the variable x was corrupted --> Hä?
-
Hallo zusammen,
vielleicht stehe ich aufgrund der Abendstunde einfach auf dem Schlauch, doch könnte mir jemand sagen, warum diese Fehlermeldung komme, wenn ich das folgende Programm ausführe?#include <iostream> #include <math.h> using namespace std; int main() { double x[50], y[50], i = 0.0; int k = 0; while(i < 10) { x[k] = i; y[k] = cos(i); k++; i+=0.2; } for (int i = 0; i < 50; i++) cout << x[i] << " | " << y[i] << endl; return 0; }
Es handelt sich dabei um einen Debug Error. WIe kommt es dazu?
Vielen Dank!
lg, freakC++
-
Deine erste Schleife schreibt in den Index 51, zumindest im Debug-Mode.
-
schreib mal in die while-schleife noch ausgaben mit rein. eventuell gibts da rundungsprobleme und du schreibst einmal zu oft in das array. oder pack noch k < 50 in die while-bedingung mit rein.
-
ok, danke! Dass ist das nicht gesehen habe
.
lg, freakC++
-
freakC++ schrieb:
Hallo zusammen,
vielleicht stehe ich aufgrund der Abendstunde einfach auf dem Schlauch, doch könnte mir jemand sagen, warum diese Fehlermeldung komme, wenn ich das folgende Programm ausführe?#include <iostream> #include <math.h> using namespace std; int main() { double x[50], y[50], i = 0.0; int k = 0; while(i < 10) { x[k] = i; y[k] = cos(i); k++; i+=0.2; } for (int i = 0; i < 50; i++) cout << x[i] << " | " << y[i] << endl; return 0; }
Es handelt sich dabei um einen Debug Error. WIe kommt es dazu?
Vielen Dank!
lg, freakC++Ist allgemein nicht so schön. Durch Umformung kommst du von den Kommazahlen weg.
-
kommt das nur mir so vor oder ist das hier Blödsinn:
freakC++ schrieb:
... int main() { double i = 0.0; ... for (int i = 0; i < 50; i++) ... }
wenn man i vorher als double deklariert und dannach dieselbe variable (obwohl sie noch gültig ist) neu definiert, dann müßte doch der Kompiler meckern
-
Nein, da das i in der Schleife das i in dem darüberliegenden Scope überdeckt.Es wird auch wieder zerstört, sobald die Schleife verlassen wird.
MfG,
ScRaT
-
Trotzdem ist das meines Erachtens schlechter Stil. Wenn man unbedingt Fliesskommazahlen und deren Ungenauigkeit in Kauf nehmen will, kann man das immer noch in einer For-Schleife erledigen. Aber durch das Vorhandensein von
k
ist das alles gar nicht nötig.Im Weiteren halte ich auch nicht besonders viel von Mehrfachdeklarationen in einer Zeile, ganz besonders, wenn es sich dabei um unterschiedliche Typen handelt.
Ach ja, und nimm doch bitte
<cmath>
statt<math.h>
. Headerdateien der C++-Standardbibliothek besitzen nie eine Dateiendung. Diejenigen der C-Standardbibliothek haben ein vorgestelltes "c".
-
Ich habe gestern Abend nicht sehr auf den Stil geachtet, da ich einfach nur schnell was ausprobieren wollte. Da war mir eigentlich alles egal :D!
Trotzdem: Ihr habt ja recht. :p
lg, freakC++
-
Hallo,
mich interessiert dieser Thread. Wie würdet ihr das denn in guten Stil machen:
Ein double Array mit Gleitkommazahlen füllen und gleichzeit natürlich einen Zähler (hier k) haben, der vom Typ int sein muss. Ich hätte das auch so gemacht!Wie gehts besser?
Danke schön
-
Ja, wie jetzt? schrieb:
Hallo,
mich interessiert dieser Thread. Wie würdet ihr das denn in guten Stil machen:
Ein double Array mit Gleitkommazahlen füllen und gleichzeit natürlich einen Zähler (hier k) haben, der vom Typ int sein muss. Ich hätte das auch so gemacht!Du bist jetzt nicht sehr genau, daher lasse ich mir auch etwas Freiheit:
double BerechneWert(unsigned int Index); double Array[Size]; for (unsigned int k = 0; k < Size; ++k) { Array[k] = BerechneWert(k); }
Wenn die Funktion
BerechneWert()
eher klein ist, kann man den Code natürlich auch direkt in die Schleife schreiben. Je nachdem kann es auch angebracht sein, die Schleifenbedingung zu ändern, aber dafür warst du zu wenig konkret.Aber eigentlich verwende ich keine Arrays. Ich mag Komfort und Sicherheit im Debug-Modus und würde eher zu
std::tr1::array
greifen (oder gleichstd::vector
, je nach Anwendungsbereich).