Arrays kopieren in c

Persönliche Seite #678530
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?
#678549
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?
Persönliche Seite #678558
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?
Persönliche Seite #678812
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));
#678856
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.
#679050
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.
Gast #679056
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren