Array in Array kopieren

Hallo,

wie kopiert man den kompletten Inhalt eines Arrays in ein anderes, gleich groß dimensioniertes Array?

Gruß Chris

z.B. so:

char textA[5] = "abc";
char textB[5] = "xyz";
// konstante Zeichenkette in String A kopieren

void setup()
{
  Serial.begin(9600);

  strcpy(textA, textB); //Kopierfunktion aus c
  Serial.println(textA);
}

void loop()
{}

oder so

int Array1[3];
int Array2[3];

void loop()
{
  // Array2 nach Array1
  for(int i = 0; i < maxFields; i++) Array[i] = Array2[i];
}

Chris72622:
wie kopiert man den kompletten Inhalt eines Arrays in ein anderes, gleich groß dimensioniertes Array?

memcpy
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga5f60008005ea7557430149926cf583d7

Ein wahres Wettrennen auf die erste Antwort und dann noch gleich drei schöne Lösungen :wink:

memcpy() ist die beste Lösung. Nicht alle Arrays sind Strings und Zeichen für Zeichen zu kopieren macht zu viel Arbeit.

Wow! 1000 Dank an alle.

Gruß Chris

sschultewolter:
oder so

int Array1[3];

int Array2[3];

void loop()
{
  // Array2 nach Array1
  for(int i = 0; i < maxFields; i++) Array[i] = Array2[2];
}

Nicht ganz; so wird Array[] mit dem letzten Elemnet von array2[] gefüllt.:

for(int i = 0; i < maxFields; i++) Array[i] = Array2[i];

grüße Uwe

Da haste Recht Uwe. Hab das nur schnell in die IDE getippt, damit ich die Struktur reinbekomme . War ungetestet.
Und es sollte meinerseits auch i und nicht 2 heißen :wink:

Werde oben mal eben ändern.

Wäre das so richtig geschrieben?

memcmp(zielarray, quellenarray, sizeof(zielarray));

Gruß Chris

Chris72622:
Wäre das so richtig geschrieben?

memcmp(zielarray, quellenarray, sizeof(zielarray));

Nur dann, wenn Du zwei Arrays VERGLEICHEN möchtest.

memcmp ==> Funktion zum Vergleichen von Speicherbereichen ("compare")
memcpy ==> Funktion zum Kopieren von Speicherbereichen ("copy")
Siehe: avr-libc: <string.h>: Strings

Wenn das Array, aus dem die Daten herauskopiert werden soll, im Flash-Speicher abgelegt ist ("PROGMEM") statt im RAM, wäre die Funktion zum Kopieren "memcpy_P" und in dem Fall müßte das Quellarray ein im PROGMEM deklariertes Array sein.

Chris72622:
Wäre das so richtig geschrieben?

memcpy(zielarray, quellenarray, sizeof(zielarray));

Gruß Chris

Kommt darauf an von welchem Typ die Variablen sind. memcpy kopiert die angegebene Anzahl von Byte nicht von Variablen.
Bei INT, LONG FLOAT werden zuwenig Bytes kopiert.
Da mußt Du sizeof(zielarray)*2 bzw sizeof(zielarray)*4 schreiben.
Warnung: Du greift direkt ins RAM. memcpy ist es egal ob nur Daten des Arrays oder irgendwelche anderen Variablen mitkopiert werden. Die Funktion kann gleich wie ein falscher Arrayindex andere Variablen überschreiben.

Grüße Uwe

uwefed:
Kommt darauf an von welchem Typ die Variablen sind. memcpy kopiert die angegebene Anzahl von Byte nicht von Variablen.
Bei INT, LONG FLOAT werden zuwenig Bytes kopiert.
Da mußt Du sizeof(zielarray)*2 bzw sizeof(zielarray)*4 schreiben.

Das halte ich für ein Gerücht. Bei einem Array wie

long einsArray[20];

ist sizeof(einsArray) automatisch mit 80 völlig korrekt, da muß nichts multipliziert werden.

Chris72622:

memcpy(zielarray, quellenarray, sizeof(zielarray));

Hatte mich verschrieben und Du hast es dann korrigiert. Ich meinte natürlich memcpy.

uwefed:
Kommt darauf an von welchem Typ die Variablen sind. memcpy kopiert die angegebene Anzahl von Byte nicht von Variablen.

Die Arrays, um die es geht sehen z.B. so aus:

byte LED_st[6] = {
  0,0,0,0,0,0};

Müsste also gehen, da sich an den einzelnen "Speicherstellen" nur Bytes befinden, oder?

Gruß Chris

jurs:
Das halte ich für ein Gerücht. Bei einem Array wie

long einsArray[20];

ist sizeof(einsArray) automatisch mit 80 völlig korrekt, da muß nichts multipliziert werden.

Dann habe ich einen Fehler gemacht. Entschuldigt bitte.
Daß man aber höllisch aufpassen muß was man da herumkopiert bleibt als meine Warnung.
Grüße Uwe

uwefed:
Daß man aber höllisch aufpassen muß was man da herumkopiert bleibt als meine Warnung.

Wenn man in C programmiert, muss man bei allem aufpassen.
Sogar beim Index seiner Arrays. Selbst wenn man nur bei:

byte LED_st[6] ;

ein:

LED_st[6]=47 ;

macht, hat man schon einen Bock geschossen.
Da braucht man das Kopieren von Bytes erst gar nicht anzufangen, um in falsche Speicherbereiche zu schreiben.

Ich möchte Arrays nutzen, indem ich sie ineinader kopiere oder miteinander vergleiche.

Sollte man das vermeiden und falls ja, warum denn? :stuck_out_tongue:

Gruß Chris

Chris72622:
Ich möchte Arrays nutzen, indem ich sie ineinader kopiere oder miteinander vergleiche.

Sollte man das vermeiden und falls ja, warum denn? :stuck_out_tongue:

Gruß Chris

Das Kopieren direkt des RAMs bringt die größere Gefahr, etwas falsch zu kopierenbzw überschreiben. Wenn Du die 2 Arrays mittels einer For Schleife kopierst, ist die Gefahr kleiner.
Grüße Uwe

uwefed:
Da mußt Du sizeof(zielarray)*2 bzw sizeof(zielarray)*4 schreiben.

In diesem Fall wie gesagt nicht nötig, aber wenn man die Größe der Datentypen braucht sollte man gleich sizeof(int) oder sizeof(float) schreiben

Das mit der Größe von Arrays ist übrigens etwas unintuitiv, da sizeof(pointer) normalerweise die Größe einer Adresse zurück gibt. In diesem Fall 2. Bei Array Variablen ist das aber nicht der Fall.

@Chris72622
Du musst halt aufpassen dass dein Ziel-Array groß genug ist. Aber das ist auch nicht eine größere Fehlerquelle wie wenn du mit Arrays und Strings im allgemeinen hantierst. Das hat C halt so an sich.

sschultewolter:
maxFields

Was bedeutet das? Kann im Netz dazu leider nichts finden (außer diesen Thread).

Gruß Chris