[Gelöst] 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?
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
while (!file.eof())
Ist Unfug.
Du machst:
- Prüfen ob am Dateiende
- Lesen (eventuell Dateiende)
- Verarbeiten (eventuell Mist)
Richtig:
- Lesen und prüfen ob erfolgreich
- Verarbeiten
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
for(int i=1; // ...
Arrays in C und C++ beginnen bei Index
0
.Bist du sicher, daß die Datei geöffnet werden konnte?
file.is_open()
?Weder 0.46 noch 0.54 sind exakt als 32-bit IEEE-754 single precision
float
darstellbar. Bist du sicher, daß die Werte in die Datei alsfloat
geschrieben wurden?
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
gleich=gleich++;
???
-
@Marco_der_Noob sagte in Erfassung von drei gleichen Folgegliedern bei Zufallszahlen:
<< gleich-1;
???
-
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.
-
@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.