Zugriffsverletzung (Segmentation fault)
-
Gut... Mit Größe meine ich das max. was in den [...] steht. Hab ich mich vllt. falsch ausgedrückt.
An meinem Problem ändert das leider nichts...
Also nochmal von Vorne:
Größe des Array: 163614
Anzahl der Werte: 163614Letzter ausgelesener Index in der Schleife 163613! Also muss der Segmentation fault eine andere Ursache haben...
-
Hallo Javun,
Letzter ausgelesener Index in der Schleife 163613
Laut Deinem Code ist der letzte Index 163614
vector<double> un(uqs); for(size_t i = 0; i != uqs;++i)
Richtig wäre:
vector<double> un(uqs); for(size_t i = 0; i < uqs;++i)
Herzliche Grüsse
Walter
-
weicher schrieb:
vector<double> un(uqs); for(size_t i = 0; i != uqs;++i)
Richtig wäre:
vector<double> un(uqs); for(size_t i = 0; i < uqs;++i)
Kommt beides exakt aufs gleiche raus.
-
Javun schrieb:
complex<double> uvar = (0,0);
uvar wird zwar 0 sein, das liegt aber an der 0 hinter dem Komma.
Der Ausdruck (0,0) ist äquivalent zu 0
Der Ausdruck (2,0) ist äquivalent zu 0
Der Ausdruck (0,3) ist äquivalent zu 3
Der Ausdruck (5,7) ist äquivalent zu 7
Siehst Du hier ein Muster?
Das, was Du schreiben wolltest war:complex<double> uvar (0,0);
Dies ist eine direkte Initialisierung und die Nullen sind hier Konstruktorparameter.
Oder Du wolltest vielleicht das hier schreiben:complex<double> uvar = complex<double>(0,0);
Javun schrieb:
sorgt die Zeile:
uvar += ua[j];
für die Zugriffsverletzung.
Klingt nach ungültigem Index j, der außerhalb des zulälssigen Bereichs ist.
Schau mal in der Doku Deines Compilers nach, ob sich bei der Standardbibliothek ein Debug-Modus aktivieren lässt. Bei G++/libstdc++ gibt es so'was, das weiß ich.
-
Hallo LordJaxom,
Kommt beides exakt aufs gleiche raus.
Uups, hast Recht.
Wobei ich die Notation
i != uqs
in einer for Schleife mindestens "ungewöhlich" finde.
Herzliche Grüsse
Walter
-
weicher schrieb:
Hallo LordJaxom,
Kommt beides exakt aufs gleiche raus.
Uups, hast Recht.
Wobei ich die Notation
i != uqs
in einer for Schleife mindestens "ungewöhlich" finde.
Herzliche Grüsse
WalterDann bist Du einfach nicht auf dem neuesten Stand.
Man schreibt ja gerne ++i statt i++, um nicht darüber nachdenken zu müssen, ob i jetzt ein eingebauter Typ ist oder ein selbergebauter. ++i ist auf allen Typen effizient, während i++ da durchaus denkbare Performanceprobleme haben könnte.
Aus dem gleichen Grund schreibt man i!=uqs statt i<uqs. Man stelle sich zum Beispiel Iteratoren auf verkettete Listen vor. != geht instant, wärend < nur in O(Abstand) geht. Es wäre denkbar, daß der op< mal sehr schnarchig ist, während der op!= immer schnell ist. != ist also theoretisch vielleicht manchmal besser. Ach, eigentlich nicht. Wer einen lahmen op< hätte, bietet den op< besser gar nicht an. Mit != zeigt man, daß man cool ist. Und doch, man muß nicht darüber nachdenken, ob der op< angeboten wird.
-
Hallo Volkard,
Dann bist Du einfach nicht auf dem neuesten Stand.
Das ist gut möglich, auch in anderen Bereichen als C++
Aber ist der (i != x) Ausdruck nicht auch potentiell gefährlich? Wenn innerhalb der Schleife jemand i auf x + 1 stellt (Natürlich nicht so offensichtlich)erlebt er eine Überaschung.
Herzliche Grüsse
Walter
-
weicher schrieb:
Aber ist der (i != x) Ausdruck nicht auch potentiell gefährlich? Wenn innerhalb der Schleife jemand i auf x + 1 stellt (Natürlich nicht so offensichtlich)erlebt er eine Überaschung.
Wer wäre denn dieser jemand? Doch wohl der Programmierer der Schleife selbst. Und beim allerersten Test fällt's auf.
-
Hallo Sepp,
SCNR
Und beim allerersten Test fällt's auf.
Eventuell weil es dann eine Zugriffsverletzung gibt?
Herzliche Grüsse
Walter
-
weicher schrieb:
Eventuell weil es dann eine Zugriffsverletzung gibt?
Ja, beispielsweise .
Und dann gibt es eben die Programmierer die den Debugger benutzen können und das Problem damit sofort erkennen, diejenigen die Debugausgaben selber schreiben und ein bisschen länger brauchen und diejenigen die überhaupt keinen Plan haben.