Arrayneu= Array1 , Array2 ???

Hallo,

ich komme nicht weiter.

Ich habe folgendes Problem:
In Variables definiere ich meine Arrays (habe auch mit char versucht) wir folgt
.
.
int arr1 = {1,2,3,4};
int arr2 = {46,47,48,49};

Nun möchte ich aber im loop-Teil mir meine Arrays selber zusammenbauen.
Ich hatte schon einiges versucht, aber nix hinbekommen. Z.B. habe ich oben die Arrays als Chrar definiert um sie unten als ein Array zusammen zu bauen. Aussehen soll es so:

int Arrayneu = {1,2,3,4,46,47,48,49};

http://www.cplusplus.com/reference/cstring/memcpy/

Was ist "Variables"? Was meinst Du mit "zusammenbauen"?

Arrays müssen mit deklariert werden, es müßte also mindestens
int Arrayneu = ...
heißen.

Wenn sich die Arrays nicht ändern sollen, dann am besten mit const deklarieren, dann werden sie direkt in den Speicher gepackt. Sonst wird ein lokales Array in einem Unterprogramm bei jedem Aufruf mit den Werten gefüllt, das dauert und kostet zusätzlichen Programmspeicher.

DrDiettrich:
Wenn sich die Arrays nicht ändern sollen, dann am besten mit const deklarieren, dann werden sie direkt in den Speicher gepackt.

Wenn du das Flash meinst: Nein. Das geht mit einzelnen Konstanten, aber nicht mit Arrays. Const bei Arrays ist lediglich ein Schreibschutz. RAM wird trotzdem belegt.

Serenifly:
Wenn du das Flash meinst: Nein. Das geht mit einzelnen Konstanten, aber nicht mit Arrays. Const bei Arrays ist lediglich ein Schreibschutz. RAM wird trotzdem belegt.

Ja?

char test[] = "dfsgsadffgsdfgh";

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

void loop() 
{
  int i = 0;
  Serial.print(test[i+3]);
  Serial.print(test[i+14]);
}

Globale Variablen verwenden 198 Bytes

Gleicher Code, nur:

const char test[] = "dfsgsadffgsdfgh";

Globale Variablen verwenden 182 Bytes

  1. Das scheint der Compiler viel besser zu optimieren als du glaubst! 8)

Das schafft er nur weil du mit zwei konstanten Indizes auf das Array zugreifst!

Mach mal Serial.println(test) und schon sieht es anders aus

Wenn das gehen würde wäre die ganze PROGMEM Krücke überflüssig

Mach mal Serial.println(test)

Nee, nee...
Ich habe das schon mit Grund so gemacht..... :o

Also so wiklich weiter komme ich nicht.

wenn ich folgendes mache:

char test2[] = {'6','7','8','9'};
char test3[] = {'5','4','3','2'};

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

void loop()
{
  int test4[]={'test2', 'test3'};
  for(int i = 0; i < 8 ; i++) {
    Serial.println(test4[i]);
    
 }  
 delay(2000);
}

dann bekomme ich als Ergebnis:

29746
29747
-25855
3840
16706
26372
23296
0

statt das gewollte:
6
7
8
9
5
4
3
2

Mach ein neues array

int test2[] = {'6','7','8','9'};
int test3[] = {'5','4','3','2'};

int neuesarray[8];
for(int i=0;i<4;i++) 
neuesarray[i]=test2[i];

for(int i=4;i<8;i++) 
neuesarray[i]=test3[i-4];

oder auch

int test2[] = {'6','7','8','9'};
int test3[] = {'5','4','3','2'};

int neuesarray[8];
for(int i=0;i<4;i++) {
neuesarray[i]=test2[i];
neuesarray[i+4]=test3[i]};// geht nur wenn beide gleich lang

ungetestet

Also so wiklich weiter komme ich nicht.

C/C++ ist kein "Wünsch dir was"
Der Compiler weiß nicht was du willst. Er kann keine Telepathie.

Was gefällt dir an memcpy() nicht?
Ich möchte dir nochmal stark raten, dich damit zu beschäftigen.

int test4={'test2', 'test3'};

Wirklich Pech, dass das keinen Error gibt.

Du meinst eventuell:

int* test4[] = {test2, test3};
Serial.println(test4[0][0]); // sollte "54" ausgeben, was das gleiche wie dein int test2[0] = '6' ist.

Die Verwendung von ' ( single quote ) in C solltest du dir evtl. mal ansehen...

Wirklich Pech, dass das keinen Error gibt.

Eine Warnung springt dabei schon raus:

warning: character constant too long for its type [enabled by default]

Will sagen dass Zeichen Literale vom Typ "int" sind (nicht char wie man vielleicht denkt!). Also zwei Zeichen würden gehen. Aber mehr sind zu viel.

Mal abgesehen davon, dass allerhöchstwahrscheinlich das nur verwirrt und gar nicht das ist, was HansWolf will.

Weder "test2" noch 'test2' oder welcher Text auch immer hätte irgendwas mit den 2 vorher definierten int arrays zu tun.

Klar ist es nicht was man will. Aber Warnungen sind oft ein guter Hinweise darauf dass das vielleicht nicht macht was man eigentlich möchte. Ob man dann versteht wieso nicht ist was anderes.

Also ich hab das jetzt ausprobiert, und es geht. Ob das allerdings das ist, was der TE wollte?

als int:

int test2[] = {6, 7, 8, 9};
int test3[] = {5, 4, 3, 2};
int test4[8];

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

  for (int i = 0; i < 4; i++)
    test4[i] = test2[i];

  for (int i = 4; i < 8; i++)
    test4[i] = test3[i - 4];

  for (int i = 0; i < 8 ; i++) Serial.println(test4[i]);

}

void loop(){}

als auch:

char test2[] = {'6', '7', '8', '9'};
char test3[] = {'5', '4', '3', '2'};
char test4[8];

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

  for (int i = 0; i < 4; i++)
    test4[i] = test2[i];

  for (int i = 4; i < 8; i++)
    test4[i] = test3[i - 4];

  for (int i = 0; i < 8 ; i++) Serial.println(test4[i]);

}

void loop(){}

sogar die memcopy Variante:

char test2[] = {'6', '7', '8', '9'};
char test3[] = {'5', '4', '3', '2'};
char test4[8];

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

  memcpy(test4, test2, 4);
  memcpy(test4+4, test3, 4);
  for (int i = 0; i < 8 ; i++) Serial.println(test4[i]);
}

void loop(){}

gibt das Ergebnis:

6
7
8
9
5
4
3
2

Ggf, korrekter wäre das:

char test2[] = {'6', '7', '8', '9'};
char test3[] = {'5', '4', '3', '2'};


void setup()
{
  Serial.begin(115200);
  char test4[sizeof(test2) + sizeof(test3) + 1];

  memcpy(test4, test2, sizeof(test2));
  memcpy(test4 + 4, test3, sizeof(test3));
  test4[sizeof(test2) + sizeof(test3)] = 0; // char array ende

  for (int i = 0; i < 8 ; i++) Serial.println(test4[i]);

  Serial.println(test4);
}

void loop() {}

Nun, HansWolf, was passt für dein Problem am besten?

Ich bin sicher, er wollte dies, jedenfalls im Versuch 2016-01-23, 07:50:10:

(Da wir nun schon bein “Full Service Pampern” sind)

int test2[] = {6, 7, 8, 9};
int test3[] = {5, 4, 3, 2};

void setup()
{
  int* test4[] = {test2, test3};

  Serial.begin(9600);

  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 2 ; j++)
       Serial.println(test4[j][i]);
}
void loop(){}

Nachtrag: Die for Schleifen-Reihenfolge kann man vertauschen, wenn man nicht die Reihenfolge
6
5
7
4

haben will…

Ich hab das natürlich nicht ausprobiert, so weit geht mein Full Service dann doch nicht.

vielen Dank für die Lösung.

memcpy ist das Stichwort!!
Danke

So habe ich es übernommen und realisiert:

char test2[] = {'1', '2','1', '2'};
char test3[] = {'5', '4', '3', '2','0','1'};
char test4[sizeof(test2)+ sizeof(test3)];

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

  memcpy(test4, test2, sizeof(test2));
  memcpy(test4+sizeof(test2), test3, sizeof(test3));
  for (int i = 0; i < sizeof(test4) ; i++) Serial.println(test4[i]);
}

void loop(){}

Noch trickreicher geht das so:

#define TEST2 '1', '2','1', '2'
#define TEST3 '5', '4', '3', '2','0','1' 
char test2[] = {TEST2};
char test3[] = {TEST3};
char test4[] = {TEST2, TEST3};

und ganz ohne memcpy oder for im Code.

Das ist dann aber sehr konstant.

HansWolf:
Nun möchte ich aber im loop-Teil mir meine Arrays selber zusammenbauen.

Und somit wäre die const Lösung raus. Hätte ja eh keinen Sinn gemacht.