Hallo kann man arrays nicht einfach so kopieren in c? array1[x] = array[a]; ich kriege immer merkwürdige array1 werte...
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?
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?
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?
Mit einem Trick kann man auch ein ganzes Array mit einem Befehl kopieren: Man verpackt es in ein struct.
oder man benutzt memcopy(*suorcearray,*targetarray,arraysize) mit den entsprechenden Zeigern
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)); |
> 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.
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.