Negative Zahlen in einer Schleife
-
Hallo zusammen,
ich möchte durch eine For-Schleife Werte für eine Funktion erhalten. Dabei sollen es die Zahlen von -15 bis +15 sein.for (int I = 0; I<16; I++) { ....(Funktion) }
Wenn ich nun "int I = -15" schreibe kommt eine Fehlermeldung, nämlich: "Listenindex überschreitet das Maximum (-15)"
Was mache ich falsch. Ich habe bisher noch nicht mit negativen Zahlen in C++ gearbeitet und weiß daher nicht, wie ich damit umgehen muss.
Vielen Dank
lg, freakC++
-
Bitte poste den ganzen Quelltext, so wie es aussieht stimmt der Inhalt der Schleifenvariable, nur später erfolgt dann eine Anweisung, die die Meldung verursacht.
-
Hi,
also es muss an einer StringGrid liegen, in der ich die Werte darstellen möchte. Wenn ich diese entferne, funktioniert das Programm.for (int I = -15; I<16; I++) { A[I] = 125 * I; StringGrid1->Cells[0][0] = "--------------------"; StringGrid1->Cells[1][0] = "Wert für A"; StringGrid1->Cells[0][I] = "Y = " + FloatToStr (I); StringGrid1->Cells[1][I] = FloatToStrF (A[I], ffNumber, 8, 2); }
-
Mir fällt gerade ein: Kann es sein, dass es keine negativen Zeilen bzw Spalten von einer StingGrid gibt? Wenn dies der Fehler ist, wie könnte man trotzdem die entsprechende Zeile/Spalte ansprechen?
Vielen Dank
lg, freakC++
-
Hallo,
mit Ihrer ID
bei 0 gehts los ^^
mfg, Micha!
-
I+15
-
Hi,
auf die eigentlich simple Lösung bin ich dann auch gekommen. Trotzdem vielen Dank. Es gibt aber noch ein Problem. Ich arbeite mit einer anderen Funktion, die etwas komplizierter ist. Auch diese soll in einer Wertetabelle von -15 bis 15 dargestellt werden. Es muss eine Hyperbel herauskommen, d.h. die Werte der entsprechenden Zahlen sind gleich.
Bsp. Wenn ich -1 und +1 einsetze kommt das gleiche heraus
for (int I = -15; I<16; I++) { R=15; A[I] = (CGM * R) / pow(pow(R, 2) + pow(I, 2), 0.75); StringGrid1->Cells[0][0] = "--------------------"; StringGrid1->Cells[1][0] = "Wert für V"; StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I); StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2); }
So sieht der Quelltext aus. Dabei ist es leider so, dass alle Werte von -15 bis 0 richtig sind, danach kommt aber voll der Müll heraus. CGM ist 587,88 und R ist 15.
Wenn ich jedoch eine neue Anwendung mache und dort den Quelltext hineinschreibe, dann sind alle Wert von -4 bis 14 richtig. Der Rest ist falsch. Der Quelltext sieht sehr ähnlich aus:
void __fastcall TForm1::FormCreate(TObject *Sender) { int A[30]; int CGM = 587.88; int R = 15; for (int I = -15; I<16; I++) { R=15; A[I] = (CGM * R) / pow(pow(R, 2) + pow(I, 2), 0.75); StringGrid1->Cells[0][0] = "--------------------"; StringGrid1->Cells[1][0] = "Wert für V"; StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I); StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2); } }
Warum erhalte ich nur nicht die richtigen Werte???
Vielen dank für euer Hilfe
lg, freakC++
-
Ich hab noch ein bissl herumgespielt. CGM wird außerhalb der for-Schleife berechnet. Wenn ich diese Berechnung aber auch noch in die Schleife stecke, dann stimmen plötzlich die Ergebnisse. Warum ist das so
Das ist doch eigentlich egal, wann CGM berechnet wird!!lg, freakC++
-
Dein Array A besitzt die Elemente 0..29. Du greifst aber auf das Element A[-15] zu. Dadurch erzeugt Deine Anwendung undefiniertes Verhalten.
-
mmh...und wie vereinbart man ein Variablenfeld von -15 bis 15????
-
gar nicht.
void __fastcall TForm1::FormCreate(TObject *Sender) { int A[30]; int CGM = 587.88; int R = 15; for (int I = 0; I<30; I++) { R=15; A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75); StringGrid1->Cells[0][0] = "--------------------"; StringGrid1->Cells[1][0] = "Wert für V"; StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I - 15); StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2); } }
BTW, Was machst Du mit pow(, 0.75)? Riecht ein bisschen nach ziehen von Wurzeln aus negativen Werten.
-
ich seh da keine Wurzeln aus negativen Zahlen! Das ist schon richtig so!!
Vielen Dank für eure Hilfe
lg, freakC++
-
void __fastcall TForm1::FormCreate(TObject *Sender) { int CGM = 587.88;
ISt int nicht ganzzahlig? Vielleicht solltest du mit double arbeiten. Also auch
double A[30]
mfg
-
freakC++ schrieb:
ich seh da keine Wurzeln aus negativen Zahlen! Das ist schon richtig so!!
Vielen Dank für eure Hilfe
lg, freakC++
und was ist das für I<15?
pow(I - 15, 2)
-
So, ne kleine Mathestunde:
Wenn ich eine negative Zahl quadriere, dann kommt immer eine positive Zahl herus!! Daher kann in dieser Funktion keine negative Zahl herauskommen und daher kann ich einen reelen Exponenten nutzen!!!!!A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75);
So, ich hoffe, dass ihr verstanden habt, dass ich recht habe
lg, freakC++PS: Code Tags ham irgendwie net gefunzt!!!
-
freakC++ schrieb:
PS: Code Tags ham irgendwie net gefunzt!!!
Das liegt an den zusätzlichen Formatierungstags die du im Code hast.
A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75);
bis bald
akari
-
Entschuldigung, da habe ich wohl nicht richtig hingeschaut.
Wenn ich ein pow sehe denke ich halt nicht an Quadrieren, da das ja der blanke Overkill ist.
-
freakC++ schrieb:
So, ne kleine Mathestunde:
Wenn ich eine negative Zahl quadriere, dann kommt immer eine positive Zahl herus!!Darum ging es doch gar nicht. pow(x,.75) heißt x^(3/4). Die Frage ist doch, ob die Summe der beiden Quadrate, die x bilden negativ wird. Wenn das der Fall ist, ermittelst Du das Kubik von x, welches dann ebenfalls negativ wäre und dann die 4. Wurzel aus dieser negativen Zahl... .
Aber die Summe der beiden Quadrate wird nicht negativ, Braunstein hat wohl übersehen, dass ich die Schleifenvariable bei 0 und nicht bei -15 starten lasse, denn dann hätte er recht!
-
witte schrieb:
Die Frage ist doch, ob die Summe der beiden Quadrate, die x bilden negativ wird.
Hi,
ich will mich ni einmischen, aber wie soll denn aus zwei positiven Werten - die zwangsläufig positiv sind wenn der negative Wert quadriert wird - was negatives werden?
mfg, Micha!
-
Yep, das stimmt. OMG, ich brauche Urlaub!