Sieb des Eratosthenes bricht bei 23 aufgrund eines Segmentation faults ab
-
Dann musst Du ein Array mit vorgegebener Größe definieren, und dann darauf testen, ob die Arraygröße für die Eingabe ausreicht. Wenn es Dir erlaubt ist, kannst über new[] und delete[] mit Pointer passenden Felder anlegen, aber …
Warum muss man so einen Sch*** in Vorlesungen/Übungen machen?
-
Frag mich das nicht :). Also führt nichts an dem Fehler vorbei?
-
@FirebladeRR sagte in Sieb des Eratosthenes bricht bei 23 aufgrund eines Segmentation faults ab:
Frag mich das nicht :). Also führt nichts an dem Fehler vorbei?
@john-0 sagte in Sieb des Eratosthenes bricht bei 23 aufgrund eines Segmentation faults ab:
Es ist noch immer ein Speicherfehler drin. Den solltest Du selbst finden.
-
Es gibt noch immer einen Fehler in Deinem Programm, selbst wenn man es mit vector umsetzt. Man findet solche Fehler leicht, wenn man einen Debugger benutzt. Hast Du das noch nie gemacht?
-
Also den Debugger habe ich bereits benutzt nur weiß ich nicht wie ich einen Speicherfehler damit ausfindig machen soll. Ich habe damit nur herausgefunden, dass es sich um einen Segmentation Fehler handelt.
-
Wie kann man das Problem finden?
- Variante 1: Du startest das Programm im Debugger und gehst Schritt für Schritt durch. Bei irgendeiner Zeile tritt dann der Fehler auf. Oder du lässt das Programm laufen und wartest, bis dir der Debugger den Fehler anzeigt. Wie das genau geht, hängt vom Debugger ab.
- Variante 2: Mit Address-Sanitizer kompilieren, hier bezogen auf die von @john-0 gepostete Code-Variante:
g++ -Wall -Wextra -g -Og -fsanitize=address prim.cpp && ./a.out
Das Programm läuft dann so:
Geben Sie den Wertebereich ein fuer die Sie die Primzahlen herausbekommen moechten. 100 ================================================================= ==11287==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6140000001dc at pc 0x56064feaf953 bp 0x7fff1ec3cfa0 sp 0x7fff1ec3cf90 WRITE of size 4 at 0x6140000001dc thread T0 #0 0x56064feaf952 in main /tmp/prim.cpp:44 #1 0x7fae0e0b90b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) #2 0x56064feaf36d in _start (/tmp/a.out+0x236d) (und weitere Ausgabe)
Der Fehler ist also in /tmp/prim.cpp:44 (also Zeile 44).
Da stehtZahlen[g+buffer] = -1;
. Also wirdg + buffer
hier wohl nicht im erlaubten Bereich liegen.Was ist buffer? Was ist g? Liegt die Summe sicher im Bereich [0, n-1)?
-
@FirebladeRR
Neben dem was wob geschrieben hat, möchte ich noch anmerken, dass auch deine Grenze in der for Schleifefor(int g=0;g<n-1;g++)
verdächtig aussieht.
Lies dir mal den Wiki Artikel Sieb des Eratosthenes durch.
-
Ok, danke ich werde mich, sobald ich zu Hause bin wieder dransetzen und hoffentlich das Problem lösen.
-
Danke an alle Helfer habe mir noch mal den Wiki Artikel durchgelesen und alles von neu programmiert statt am alten Programm festzuhalten. Es funktioniert jetzt.
-
@FirebladeRR sagte in Sieb des Eratosthenes bricht bei 23 aufgrund eines Segmentation faults ab:
Danke an alle Helfer habe mir noch mal den Wiki Artikel durchgelesen und alles von neu programmiert statt am alten Programm festzuhalten. Es funktioniert jetzt.
Poste es gerne, wenn du Verbesserungsvorschläge bekommen willst.