Hallo, ich habe ein Problem mit dem Kopieren von Array Werten an eine andere Position des Array. Bzw sollen diese einfach getauscht werden (in C++). Was ich versucht habe, durch den Compiler geht, das Programm aber abstürzen lässt: Arr[Zeile][Spalte + 1] = Arr[Zeile][Spalte]; Arr ist [800][600] groß. Habt ihr eine Idee, wie ich diesen Tausch anders bewältigen kann? MfG
int temp; temp=Arr[Zeile][Spalte + 1] Arr[Zeile][Spalte]=temp; würde es auch so gehen?
Naja. Hast du beim Compiler alle Warnungen an? Wie äußert sich der Absturz?
1 | a = temp; |
2 | a = b; |
3 | b = temp |
Wäre das Tauschen mit Hilfsvariable. Mein Favorit zum Tauschen zweier Variablen (oder Einträgen im Array) ist das hier:
1 | a = a xor b; |
2 | b = b xor a; |
3 | a = a xor b; |
Tauscht komplett ohne Hilfsvariable :D
Liegen Zeile und Spalte denn im gültigen Bereich? Also (Zeile >= 0 && Zeile < 800 && Spalte >= 0 && Spalte < 600-1). Versuche eventuell ein Minimal beispiel zu erstellen, dass das Problem aufweist. Arrayzugriffe sind für sich genommen noch kein Problem. valgrind und/oder ASAN können bei der Problemsuche auch helfen. http://valgrind.org/docs/manual/quick-start.html https://github.com/google/sanitizers/wiki/AddressSanitizer
Sebastian R. schrieb: > Hast du beim Compiler alle Warnungen an? Wie äußert sich der > Absturz? Ja, soweit ich das beurteilen kann. Der Absturz Äußert sich wie folgt: Das Programm ist abgestürzt. Segementation fault. Sebastian R. schrieb: > a = temp; > a = b; > b = temp müsste es nicht so sein? temp= a; a= b; b=temp; ? MfG
DPA schrieb: > Liegen Zeile und Spalte denn im gültigen Bereich? Ja das ganze läuft in der Schleife: for (element = 1; element <= Zeile * Spalte; element++) sorry, das hätte ich noch dazu sagen sollen.
Sven schrieb: > Der Absturz Äußert sich wie folgt: Das Programm ist abgestürzt. > Segementation fault. Würdest Du Dein Programm im Debugger laufen lassen, würde der Dir sagen, welcher Programmschritt dazu führt; Du könntest Dir an dieser Stelle Deine Variablen ansehen etc. Du könntest ja mal Deinen Programmcode zeigen, nicht nur eine komplett nichtssagende Zeile.
Die Frage habe ich auch missverstädnlich gestellt! Es soll lediglich ein ArrayWert an eine andere Position geschrieben werden. z.b. eine Spalte weiter rechts
Sven schrieb: > for (element = 1; element <= Zeile * Spalte; element++) Daß in C (und verwandten Sprachen) das erste Arrayelement mit 0 angesprochen wird, ist Dir irgendwie entgangen? Wenn Du
1 | char bla[10]; |
hast, darfst Du die Elemente darin nicht so ansprechen:
1 | for (i = 1; i <= 10; i++) |
2 | machwasmit(bla[i]); |
Dann ist es kein Wunder, wenn Dein Programm auf die Schnauze fällt. Richtig wäre
1 | for (i = 0; i < 10; i++) |
2 | machwasmit(bla[i]); |
Das spricht bla[0] bis bla[9] an. Das fehlerhafte Beispiel spricht bla[1] bis bla[10] an, bla[10] aber gibt es gar nicht ...
Sven schrieb: > > müsste es nicht so sein? > > temp= a; > a= b; > b=temp; > > ? > > MfG Äh. Ja. Natürlich. Irgendwas hab ich da verdreht.
>>Arr[Zeile][Spalte + 1] = Arr[Zeile][Spalte];
[Spalte + 1] bietet auch noch ne Chance in den letzten
Schleifendurchgängen über Arraygrenzen hinauszulesen.
Heinz R. schrieb: > bietet auch noch ne Chance in den letzten Schleifendurchgängen über > Arraygrenzen hinauszulesen. Natürlich. Deswegen soll der Threadstarter ja auch seinen Code zeigen, und nicht nur nichtssagende (aber verdächtig riechende) Schnipselchen davon.
Ich hoffe ja einfach mal, dass Zeile und Spalte bei: Sven schrieb: > Arr[Zeile][Spalte + 1] = Arr[Zeile][Spalte]; Und: Sven schrieb: > for (element = 1; element <= Zeile * Spalte; element++) Nicht die selben Variablen sind.
Rufus Τ. F. schrieb: > Daß in C (und verwandten Sprachen) das erste Arrayelement mit 0 > angesprochen wird, ist Dir irgendwie entgangen? nein, element hat weder mit der Frage, noch mit der Arrayzuweisung etwas zu tun. Es ist lediglich ein counter, der für andere Dinge benötigt wird. DPA schrieb: > Nicht die selben Variablen sind. natürlich nicht
Tauschen geht in C++ auch einfacher:
1 | std::swap (Arr[Zeile][Spalte + 1], Arr[Zeile][Spalte]); |
Das hat aber nichts mit dem Absturz-Problem zu tun. Da ist noch irgendwas im Programm falsch. Füg einfach mal ein
1 | assert (Zeile < std::size(Arr)); |
2 | assert (Spalte+1 < std::size(Arr[0])); |
ein, das hilft den Fehler einzugrenzen.
Sven schrieb: > nein, element hat weder mit der Frage, noch mit der Arrayzuweisung etwas > zu tun. Es ist lediglich ein counter, der für andere Dinge benötigt > wird. Ach. Wie schön, daß wir das anhand des von Dir gezeigten Quelltextes nachvollziehen können. Bist Du eigentlich an einer Lösung Deines Problemes interessiert, oder welchen Sinn hat dieser Thread hier?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.