[Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen
-
@manni66 Da ich vorher "gleich" mit 1 initialisiert hatte, wollte ich die an der Stelle wieder abziehen..
Habe das jetzt geändert
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
mein Debugger stürzt einfach ab
Das halte ich für ein Gerücht.
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
Mh.. mein Debugger stürzt einfach ab. Kein gutes Zeichen.
ich hab jetzt in den for-Schleifen die Laufindizes auf 0 gesetzt und die Abbruchbedingung korrigiert..
Und die Intervallgrenzen nochmal einem konstanten float zugewiesen und initialisiert..
Keine Verbesserung..
Das Abstürzen des Debuggers sagt mir, dass da wohl einiges schiefläuft..
Werd das vllt. nochmal anders aufbauen.Korrigier zuallererst einmal das hier:
@Swordfish sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
float a[1000000];
Das sind ~3,8 MB. Bist du sicher, daß dein Stack so groß ist? Was sagt dein Debugger?
Wahrscheinlich kommt dein Programm gar nicht einmal zum Einstiegspunkt der main, weil es nicht genug (Stack-)Speicher dafür hat.
-
@manni66 Naja, auf jeden Fall schließt sich das Programm ("dev c++") wenn ich die Debug-Dateien erstellen
will.
Muss jetzt nochmal in die Uni. Werde da am Linux-Rechner in meiner "Standartumgebung" das nochmal probieren.
Lese dann gegen 18 Uhr hier nochmal nach..@SeppJ Ok, das klingt logisch. Werde das berücksichtigen und später Meldung erstatten.
@yahendrik Auch dir danke, wie gesagt, wird gleich ausprobiert
-
Startest du evtl. die Releaseversion? Bei der Debugversion sollte sich der Debugger schon melden (Stackoverflow). Ersetze einfach mal dein float a[...] durch std::vector<float> a(1000000);. Vorher <vector> inkludieren.
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
und die Abbruchbedingung korrigiert..
Die hätten schon gestimmt.
-
Eigentlich sowieso qutasch, die Zahlen alle im Speicher zu halten, wenn du doch nur 3 gleichzeitig brauchst.
-
@Jockelx Es sollten noch andere Test an den Zufallszahlen stattfinden. Daher wollte ich die erstmal im Speicher behalten.
-
@manni66 sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
gleich=gleich++;
???
!!!
Wenn ich nicht irre ist das undefiniertes Verhalten.(Zumindest vor C++17 (N4659)).
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
@Jockelx Es sollten noch andere Test an den Zufallszahlen stattfinden. Daher wollte ich die erstmal im Speicher behalten.
Mach's aber doch trotzdem einmal so. Das löst nämlich höchstwahrscheinlich mit einem Schlag all deine Probleme.
Die meisten denkbaren Tests kommen ohnehin mit einem einfachen Durchlauf aus. Möglicherweise geht es bei der Aufgabe sogar genau darum, dies zu erkennen. Große Mengen von Werten für Statistiken nur zu durchlaufen (anstatt unnötig zu speichern und dann zu durchlaufen) ist ein typisches und wichtiges Programmiermuster. Und das Gegenteil davon, das unnötige Zwischenspeichern, ist ein haufiges Anti-Pattern, das dir dein Lehrer vielleicht austreiben möchte.
-
@Swordfish sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
Wenn ich nicht irre ist das undefiniertes Verhalten. (Zumindest vor C++17 (N4659)).
Ich wüsste nicht, dass sich das geändert hätte (Präfixinkrement ist eine andere Geschichte). Die Erhöhung gespeicherten Wertes aufgrund des Inkrements findet irgendwann nach der Ermittelung des Wertes des Inkrements statts. Letzteres dient dazu, den gespeicherten Wert durch Zuweisung zu ändern. Beide Änderungen sind untereinander unsequenced und überlappend -> UB.
-
@camper [expr.ass] §8.18/1:
[...] In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. The right operand is sequenced before the left operand.
-
Ok, habe das ganze jetzt nochmal ohne das float-Array zusammengesetzt.
Läuft jetzt durch und die Ausgabe passt.
Vielen Dank an alle, lag echt an der Größe von dem ArrayHier nochmal der Code
#include <iostream> #include <fstream> using namespace std; int main() { float next; char komma; int gleich=0; float zahl; float vorgaenger=2; float vorvorgaenger=3; float untere=0.46; float obere=0.54; fstream file; file.open("U12KASRO.dat", ios::in); while (!file.eof()) { file >> next; file >> komma; zahl = next; if(zahl >= untere && zahl <= obere) { if(zahl == vorgaenger && zahl == vorvorgaenger) { gleich++; } } vorvorgaenger=vorgaenger; vorgaenger=zahl; } cout << "Die Anzahl 3 gleicher Folgeglieder beträgt: " << gleich; return 0; }
-
@Swordfish sagte in [Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
@camper [expr.ass] §8.18/1:
[...] In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. The right operand is sequenced before the left operand.
Genau.
-
-
@Swordfish sagte in [Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
@camper sagte in [Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
Genau.
?
Da du das Zitat ohne eigene Text bringst, kann ich nicht wissen, was ich damit anfangen soll. Ein Widerspruch zu meiner Aussage besteht ja nicht, während sie gleichzeitig auch nicht ausdrücklich belegt wird.
-
[...] In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. The right operand is sequenced before the left operand.
Interpretiere ich in Bezug auf
int i = 42; i = i++;
so, daß zuerst
i++
ausgewertet wird (i = 43
) und dann zugewiesen wird.
-
@Marco_der_Noob sagte in [Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
while (!file.eof())
@Marco_der_Noob Bist Du sicher, daß Du alle Antworten gelesen hast?
-
@Swordfish sagte in [Gelöst] Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
[...] In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. The right operand is sequenced before the left operand.
Interpretiere ich in Bezug auf
int i = 42; i = i++;
so, daß zuerst
i++
ausgewertet wird (i = 43
) und dann zugewiesen wird.Das ist schon richtig. Aber value computation meint immer nur die Bestimmung des Wertes eines Ausdrucks, nicht die damit verbundenen Nebeneffekte. Wie diese mit zusammenhängen, hängt von der konkreten Ausdrucksart zusammen.
Dein Zitat gibt die Aufeinanderfolge der Auswertung der Operanden vor, und wie sich der Nebeneffekt der Zuweisung dort einreiht.
7.1.6.5/1 bestimmt, dass der Nebeneffekt des Inkrementierens nach der Bestimmung des Wertes dieses Ausdrucks (also der Ermittelung des alten Wertes zwecks Weiterverwendung) stattfindet. Wir wissen hier hier also nur, dass beide Nebeneffekte nach der Auswertung des Inkrementausdrucks stattfinden, und zusätzlich, dass der Nebeneffekt der Zuweisung, vor der Wertbestimmung der Zuweisung stattfindet (das macht Mehrfachzuweisung möglich). Es genügt aber nicht, um eine Reihenfolge der beiden Nebeneffkte zu etablieren.
-
@Swordfish mhh.. das ist irgendwie untergegangen.
Weiß auch grade nicht wie ich das sinnvoll umsetzen soll, da ich ja jetzt nur noch mit der while-Schleife arbeite..
Ich habe die Aufgabenstellung nochmal gelesen und gemerkt das ich voll am Thema vorbeigarbeitet habe..
Sollte prüfen wie oft 3 aufeinanderfolgende Zahlen in dem Intervall liegen..
Hab jetzt noch eine Ausgabedatei hinzugefügt, in der die Zahlen aufgelistet werden..
Das funktioniert alles soweit.
Wo soll ich denn dann prüfen, wann das Ende erreicht ist?nochmal der Code zu dieser anderen Aufgabenstellung:
#include <iostream> #include <fstream> using namespace std; int main() { float next; char komma; int gleich=0; float zahl; float vorgaenger=2; float vorvorgaenger=3; float untere=0.46; float obere=0.54; fstream file; file.open("U12KASRO.dat", ios::in); fstream out; out.open("Intervall.dat", ios::out); while (!file.eof()) { file >> next; file >> komma; zahl = next; if(zahl >= untere && zahl <= obere && vorgaenger>=untere && vorgaenger<=obere && vorvorgaenger>=untere && vorvorgaenger<=obere) { gleich++; out << vorvorgaenger << "," << vorgaenger << "," << zahl << ","; } vorvorgaenger=vorgaenger; vorgaenger=zahl; } out.close(); file.close(); cout << "Die Anzahl dreier Folgeglieder im gegebenen Intervall beträgt: " << gleich; return 0; }
Viele Grüße,
ein heute sehr verwirrter Marco