Hallo, ich mache gerade meine ersten Schritte mit Qt und Qt Creator. Es gefällt mir auch. Beruflich "verheirate" ich inkompatible Datenbanksysteme mit c#, aber das nur so nebenbei 😉 Der unten dargestellte Algorithmus führt zum Programmabbruch mit dieser Fehlermeldung:
The inferior stopped because it received a signal from the Operating System.
Signal name : SIGSEGV Signal meaning : Segmentation fault
Der Abbruch erfolgt allerdings nur dann, wenn ich für int N einen Wert eingebe, der 2.100.000 oder größer ist. Der Wert wird aus einem QLineEdit bezogen und in Zeile 2 des Codeblocks zum int gewandelt. Beim Debuggen (und bei normalem Lauf) bricht das Programm (oder besser: Progrämmchen) in Zeile 4 ab mit der o.a. Fehlermeldung. Es entsteht der Eindruck, dass das Array mit 2.100.000 oder mehr Elementen vom Typ int zu groß für 16 GB RAM wäre. Das halte ich allerdings für ein Gerücht, denn da passt nachweislich mehr hinein.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //Sieve of Eratosthenes int N = lneIntervalLimit->text().toInt(); int i=0, j=0, a[N+1]; for(a[1]=0, i=2; i<=N; i++) a[i]=1; ============>>> HIER KOMMT DER ABBRUCH for(i=2; i<=N/2; i++) if(a[i]) for(j=i; j<= N/i; j++) a[i*j]=0; int k=0; for(i=1; i<=N; i++){ if(a[i]) { result+=QString::number(i)+"\n"; k++; } } |
Falls Sieve of Eratosthenes unbekannt ist: Damit "fischt" man recht schnell alle Primzahlen von 2 bis (in meinem Fall) N. Das Progrämmchen sollte einer der ersten Versuche sein. Die Primzahlen sind dann auf Knopfdruck in QTextEdit untereinander zu sehen. k (Zeile 9) zählt die gefundenen Primzahlen und Zz. 10-14 "bauen" dann den Zahlenstring, der am Ende in die QTextEdit "hineingeworfen" wird. Das "Hineinwerfen" habe ich jedoch nicht mit zitiert.
Übrigens, mit C (C99-Standard und Konsolen-Anwendung) habe ich das gleiche Problem. Das führt wiederum zu der Annahme, dass es eher am Betriebssystem liegt als an mir oder der Programmiersprache bzw. Entwicklungsumgebung. Oder sind es doch Einstellungen des IDE?
Meine Frage wäre nun, ob jemand einen Weg kennt, diese Größenbegrenzung des des Arrays zu umgehen. Über die Ursachen finde ich im Netz ziemlich viel aber mein Fall ist leider nicht drin...