Forum: PC-Programmierung Arrays kopieren in c


von Der G. (jonnyk)


Lesenswert?

Hallo

kann man arrays nicht einfach so kopieren in c?

array1[x] = array[a];

ich kriege immer merkwürdige array1 werte...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das kopiert nur ein Element, und zwar das mit dem Index a, von dem Array 
namens array an die Stelle des Elements mit dem Index x im Array namens 
array1.

Komische Werte... gibt der C Compiler Warnungen aus, in der Art, dass 
bei der Zuweisung von nichtidentischen Datentypen Stellen verloren 
gehen? Welchen Typ haben die Elemente der Arrays array und array1? Hast 
du mal ein Beispiel für komische Werte und erwartete Werte?

von Der G. (jonnyk)


Lesenswert?

Hi Stefan

habe folgendes

2 arrays typ char

und kopiere in der forschleife in das array1[0...]
die werte vom array2[offset...]

die abbruch bedienung für die forschleife ist x<anzahl

ist so weit ok?

aber ich bekomme immer in dem array 0000000 obwohl im array2 wesentlich 
mehr dirn steht. der "complizierer" meckert eigentlich auch nicht.

also müsste es so funktionieren oder?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Deine Beschreibung in allen Ehren, aber der Codeschnippsel hätte 1000x 
mehr geholfen. Eine Codezeile sagt mehr als tausend Worte ;-)

Soweit ich deine Beschreibung verstanden habe:
1
#define ANZAHL 42
2
#define OFFSET 23
3
char ArrayZiel[ANZAHL];
4
char ArrayQuelle[OFFSET+ANZAHL];
5
6
void Kopiere(void)
7
{
8
   int x;
9
   for (x = 0; x < ANZAHL; x++)
10
      ArrayZiel[x] = ArrayQuelle[OFFSET+x];
11
}

EDIT: Wenn du x als Schleifenzähler hast, aber gleichzeitig auch a eine 
Art Zähler ist... vergisst du vielleicht a auch hochzuzählen?

von Benedikt K. (benedikt)


Lesenswert?

Mit einem Trick kann man auch ein ganzes Array mit einem Befehl 
kopieren: Man verpackt es in ein struct.

von winne (Gast)


Lesenswert?

oder man benutzt memcopy(*suorcearray,*targetarray,arraysize) mit den 
entsprechenden Zeigern

von Simon K. (simon) Benutzerseite


Lesenswert?

Stefan B. wrote:
> Deine Beschreibung in allen Ehren, aber der Codeschnippsel hätte 1000x
> mehr geholfen. Eine Codezeile sagt mehr als tausend Worte ;-)
>
> Soweit ich deine Beschreibung verstanden habe:
>
>
1
> #define ANZAHL 42
2
> #define OFFSET 23
3
> char ArrayZiel[ANZAHL];
4
> char ArrayQuelle[OFFSET+ANZAHL];
5
> 
6
> void Kopiere(void)
7
> {
8
>    int x;
9
>    for (x = 0; x < ANZAHL; x++)
10
>       ArrayZiel[x] = ArrayQuelle[OFFSET+x];
11
> }
12
>
>
> EDIT: Wenn du x als Schleifenzähler hast, aber gleichzeitig auch a eine
> Art Zähler ist... vergisst du vielleicht a auch hochzuzählen?

Die Funktion gibts übrigens schon in fast jeder (oder jeder?) 
C-Standard-Library:
1
memcpy(ArrayZiel, ArrayQuelle, sizeof(ArrayQuelle));

von Uhu U. (uhu)


Lesenswert?

> Die Funktion gibts übrigens schon in fast jeder (oder jeder?)
> C-Standard-Library:
>
> memcpy(ArrayZiel, ArrayQuelle, sizeof(ArrayQuelle));

Nur mit dem kleinen, aber feinen Unterschied, daß memcpy bei 
Multibyte-Maschinen die Zugriffe so optimiert, daß die einzelnen 
Schritte die für die Hardware effizienteste Datenmenge auf einmal 
kopieren.

memcpy ist also der handgestrickten Lösung vorzuziehen.

von Der G. (jonnyk)


Lesenswert?

Ausserdem muss ich aus einem array mit einem offset kopieren. und nicht 
das gesamte array.

@Stefan B.
Stimmt stefan hätte lieber ein wenig code mit reingebracht.

aber verstanden hast du mich schon richtig.

Danke für die antworten.

von Karl H. (kbuchegg)


Lesenswert?

Der Grosse wrote:
> Ausserdem muss ich aus einem array mit einem offset kopieren. und nicht
> das gesamte array.

Und.
Dem memcpy ist es doch völlig wurscht wohin der Zeiger auf
die Datenquelle zeigt. Wenn der nicht auf den Arrayanfang
sondern mitten in das Array zeigt, dann beginnt memcpy
dort zu kopieren.

Damit hier kein Missverständnis aufkommt. memcpy ist nicht
speziell für Arrays gedacht. memcpy kopiert direkt vom
Speicher in den Speicher. Und zwar eine bestimmte Anzahl
Bytes. Was dort im Speicher steht, ist dem memcpy sowas
von egal. Die einzige Einschränkung besteht darin, dass
sich die Speicherblöcke nicht überlagern dürfen.
Es wäre also zb. mit memcpy nicht möglich in einem
Array alle Elemente um eine Position nach vorne oder
nach hinten zu verschieben. Denn dann würde sich Quelle
und Ziel im Speicher überlappen.

von Rolf Magnus (Gast)


Lesenswert?

> Die einzige Einschränkung besteht darin, dass sich die Speicherblöcke
> nicht überlagern dürfen.

Es gibt übrigens auch eine Standard-Funktion, die diese Einschränkung 
nicht hat. Sie heißt memmove und wird genauso benutzt wie memcpy.

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.