[SOLVED] Abzählreim Programm produziert SIGSEGV, aber warum?
-
int indizes[childs];Dieses hier solltest du mal versuchen zu ändern in
int *indizes = new int[ childs ];Um Speicherlecks zu vermeiden solltest du dann, wenn du das Array nicht mehr brauchst, den Speicher wieder freigeben mit
delete [] indizes;Anmerkung: Der Plural von "Child" ist "Children"

-
i + 1 % childs
Das liest der Compiler als
i + (1 % childs)du willst aber vermutlich
(i % childs)+1
-
It0101 schrieb:
int indizes[childs];Dieses hier solltest du mal versuchen zu ändern in
int *indizes = new int[ childs ];wenn schon ändern, dann bitte in std::vector. Ich sehe keinen Grund, hier new/delete reinzubringen.
-
Ah: Moment... die Compilerausgaben waren vorher nicht da, oder?!
Den richtigen Code posten.... gelesen, was?
Nimm noch den
-pedanticSchalter dazu!
-
Furble Wurble schrieb:
Compilerwarnungen höher drehen. Bei mir heisst es z.B.:
test.cc:16:23: warning: ISO C++ forbids variable length array ‘indizes’ [-Wvla]Schau noch mal in Deine C++ Unterlagen, wie das ist mit dynamischen Arrays, bzw. deren Alternative
std::vector<>.It0101 schrieb:
int indizes[childs];Dieses hier solltest du mal versuchen zu ändern in
int *indizes = new int[ childs ];Um Speicherlecks zu vermeiden solltest du dann, wenn du das Array nicht mehr brauchst, den Speicher wieder freigeben mit
delete [] indizes;Anmerkung: Der Plural von "Child" ist "Children"

Irrelevant weil der GCC VLA kennt.
-
Shade Of Mine schrieb:
i + 1 % childs
Das liest der Compiler als
i + (1 % childs)du willst aber vermutlich
(i % childs)+1
Nicht ganz, er will (i+1) % childs. Und dann klappt das ganze auch...
-
Skym0sh0 schrieb:
Shade Of Mine schrieb:
i + 1 % childs
Das liest der Compiler als
i + (1 % childs)du willst aber vermutlich
(i % childs)+1
Nicht ganz, er will (i+1) % childs. Und dann klappt das ganze auch...
Exakt das wars, der Tafelanschrieb war nicht korrekt, habs eben nochmal im Skript nachgeschaut und da wars dann.
-
Videonauth schrieb:
Exakt das wars, der Tafelanschrieb war nicht korrekt, habs eben nochmal im Skript nachgeschaut und da wars dann.
Im sinne der Aufgabenstellung solltest du aber trotzdem noch Zeile 16 in std::vector ändern, da VLAs bloß eine Erweiterung deines Compilers sind, kein Standard-C++. Das weiß (hoffentlich!) auch dein Lehrer.
Ansonsten könnte man noch viele Kleinigkeiten stilistisch verbessern, aber es sind keine weiteren "echte" Fehler mehr drin.
-
Nachtrag dazu:
Damit es bei mir kompiliert (Visual Studio 2012) habe ich (wie SeppJ jetzt schon gesagt hat) diese Zeileint indizes[childs];in diese geändert:
std::vector<int> indizes(childs);Macht das gleiche und ist besser und sicherer.
-
Videonauth schrieb:
Exakt das wars, der Tafelanschrieb war nicht korrekt, habs eben nochmal im Skript nachgeschaut und da wars dann.
Auch klar warum das so sein muss?
-
Shade Of Mine schrieb:
Videonauth schrieb:
Exakt das wars, der Tafelanschrieb war nicht korrekt, habs eben nochmal im Skript nachgeschaut und da wars dann.
Auch klar warum das so sein muss?
Ist mir noch nicht ganz klar, da lese ich grade darüber und arbeite es auf dem Papier auf.
-
Videonauth schrieb:
Shade Of Mine schrieb:
Videonauth schrieb:
Exakt das wars, der Tafelanschrieb war nicht korrekt, habs eben nochmal im Skript nachgeschaut und da wars dann.
Auch klar warum das so sein muss?
Ist mir noch nicht ganz klar, da lese ich grade darüber und arbeite es auf dem Papier auf.
% liefert ja den Rest einer Division.
Also
5%3 == 1 mal, 2 Rest
Sprich: 2 ist das ergebnisDas bedeutet aber auch, dass man mit % einen maxmimal Wert bestimmen kann:
n%m ist 0 bis (m-1)
Denn wenn der Rest gleich m wäre - dann würde m ja noch einmal mehr rein passen.(i % childs)+1
oder auch
(i+1) % childsich bin mir nicht sicher was von beiden das gewünschte ist, aber ich tippe mittlerweile eher auf das 2.
Das ergebnis vom 1. ist 1 bis childs
Das ergebnis vom 2. ist 0 bis childs-1
-
Also konkret:
(i+1)%childs
Sei gegeben 5 Kinder, ergeben dich folgende Indizes
Array[0] = (0+1)%5 = 0 Rest 1 = 1
Array[1] = (1+1)%5 = 0 Rest 2 = 2
Array[2] = (2+1)%5 = 0 Rest 3 = 3
Array[3] = (3+1)%5 = 0 Rest 4 = 4
Array[4] = (4+1)%5 = 1 Rest 0 = 0Wenn ich das nun richtig verstanden habe.
-
Videonauth schrieb:
Wenn ich das nun richtig verstanden habe.

-
Und genau diese Ergebnisse nutzt du später als Index für dein Array um Kinder zu eliminieren, wenn es keine Silben mehr zum Sprechen gibt.
Der Knackpunkt ist, die nutzt eben diese Ergebnisse später als Index, daher muss es die 2. von Shade-of-Mine's Lösungen sein, die erste gibt dir wie du gemerkt hast Fehler beim Arrayzugriff (Out-Of-Bounds 'n' shit)