mikrocontroller.net

Forum: PC-Programmierung Arrays kopieren in c


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

kann man arrays nicht einfach so kopieren in c?

array1[x] = array[a];

ich kriege immer merkwürdige array1 werte...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define ANZAHL 42
#define OFFSET 23
char ArrayZiel[ANZAHL];
char ArrayQuelle[OFFSET+ANZAHL];

void Kopiere(void)
{
   int x;
   for (x = 0; x < ANZAHL; x++)
      ArrayZiel[x] = ArrayQuelle[OFFSET+x];
}

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder man benutzt memcopy(*suorcearray,*targetarray,arraysize) mit den 
entsprechenden Zeigern

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
> #define ANZAHL 42
> #define OFFSET 23
> char ArrayZiel[ANZAHL];
> char ArrayQuelle[OFFSET+ANZAHL];
> 
> void Kopiere(void)
> {
>    int x;
>    for (x = 0; x < ANZAHL; x++)
>       ArrayZiel[x] = ArrayQuelle[OFFSET+x];
> }
> 
>
> 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:
memcpy(ArrayZiel, ArrayQuelle, sizeof(ArrayQuelle));

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.