Forum: PC-Programmierung Array-Element Kopieren


von Sven (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

int temp;

temp=Arr[Zeile][Spalte + 1]
Arr[Zeile][Spalte]=temp;


würde es auch so gehen?

von Sven (Gast)


Lesenswert?

Leider bekomme ich in beiden Fällen den Fehler: Segmentation Fault..

von Sebastian R. (sebastian_r569)


Lesenswert?

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

von DPA (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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 ...

von Sebastian R. (sebastian_r569)


Lesenswert?

Sven schrieb:
>
> müsste es nicht so sein?
>
> temp= a;
> a= b;
> b=temp;
>
> ?
>
> MfG


Äh. Ja. Natürlich. Irgendwas hab ich da verdreht.

von Heinz R. (Gast)


Lesenswert?

>>Arr[Zeile][Spalte + 1] = Arr[Zeile][Spalte];

[Spalte + 1] bietet auch noch ne Chance in den letzten 
Schleifendurchgängen über Arraygrenzen hinauszulesen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von DPA (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.