Array in einem Array speichern und Ausgabe???

Moin,

kann man so ein Array in einem Array speichern und anschließen ausgeben?

char lon[15];

char Position1[15];

gps.getPar(lon, lat, alt, time, vel);

strcpy(Position1[15], lon);

Serial.println(Position1[15]);

Hi

Da JEDER hier Deine verwendete Lib in und auswendig kennt, wirst Du vermutlich von hilfreichen Antworten geradezu erschlagen werden ... Oh, Ironie ... was 'baut' denn Deine verwendete Lib als Rückgabe zusammen oder in wie fern werden die Variablen 'lon', 'lat', 'alt', 'time', 'vel' von der Lib als EINgaben benötigt bzw. was wird davon als AUSgabe benutzt?

Solltest Du eh alleine weiter machen wollen, brauchst Du hier auch nicht auf Fragen zu antworten.

MfG

Hallo,

wenn die Datentypen übereinstimmen kannst du einfach mittels Index den Wert vom einen dem anderen Array übergeben. Kleines ausführliches Bsp.

const byte SIZE = 5;
byte vorlage[SIZE] = {11,33,55,77,99};
byte copy[SIZE];

void setup() {
  Serial.begin(9600);
 
  // Kontrollausgabe vorlage
  for (byte i=0; i<SIZE; i++) {
    Serial.print(vorlage[i]); Serial.print('\t');
  }
  Serial.println();

  // Kontrollausgabe copy
  for (byte i=0; i<SIZE; i++) {
    Serial.print(copy[i]); Serial.print('\t');
  }
  Serial.println();

  // Wertübergabe mittels index
  for (byte i=0; i<SIZE; i++) {
    copy[i] = vorlage[i];
  }

  // erneute Ausgabe copy
  for (byte i=0; i<SIZE; i++) {
    Serial.print(copy[i]); Serial.print('\t');
  } 
}

void loop() {
 
}

Alles weitere nach näheren Details wie postmaster schon sagte.

Nur wenn das ein C String, d.h. Null-terminiert. Für reguläre Arrays ist memcpy() die richtige Wahl

char Position [15]; // definiert Speicher für bis zu 14 Zeichen + Endekennung
strcpy (Position1, lon); // kopiert
Serial.println (Position1); // gibt einen Text aus

für Serial.print() müssen char-arrays (cstrings) nicht unbedingt nullterminiert sein.
char test[20]=“test”;
wird auch ohne terminales ‘\0’ korrekt von Serial ausgegeben.
Auch strncpy etc. setzen nicht zwangesweise eine Nullterminierung, aber auch dann arbeitet Serial korrekt - ist aber eine Nullterminierung vorhanden, wird sie auch von Serial beachtet.

Daher funktioniert auch bei char-Arrays/cstrings:

char liste[5][20]={"erste", "zweite", "dritte", "vierte", "fünfte"};
for(int i=0; i<5; i++) Serial.println(liste[i]);

PS
sind deine Rückgabewerte allerdings int oder unsigned long, float oder double, dann kannst du deklarieren

double tabelle[5]; // oder welcher var typ auch immer richtig ist

tabelle[0]=gps.getPar(lon);
tabelle[1]=gps.getPar(lat);
...
for(int i=0; i<5; i++) Serial.println(tabelle[i]);

(Tippfehler vorbehalten)

Vielen lieben dank an alle.

Wollte nur die Verkürtze Form zeigen das es nicht zu verwirrt. Hatte nichts damit zu tun das ich euch nicht mein code zeigen wollte

dsyleixa: für Serial.print() müssen char-arrays (cstrings) nicht unbedingt nullterminiert sein. char test[20]="test"; wird auch ohne terminales '\0' korrekt von Serial ausgegeben.

Falsch. Da ist ein '\0' am Ende dran. Lass Dir doch einfach mal alle Zeichen als HEX ausgeben.

Gruß Tommy

ich meinte nicht das, was Arduino daraus macht, sondern was man selber definiert und eingibt, denn sonst müsste es statt char test[20]="test"; heißen char test[20]="test\0"; und das ist nicht unbedingt nötig.

Was Du meinst, ist uninteressant. Was im Speicher steht, ist entscheidend.

Gruß Tommy

Tommy56: Was Du meinst, ist uninteressant. Was im Speicher steht, ist entscheidend.

Gruß Tommy

falsch, was der User eingibt, insb. der Anfänger, ist entscheidend.

Auch z.B. wenn man die char-Elemente des cstrings einzeln manipuliert, funktioniert es ohne dass man ein (neues) terminales \0 eingeben muss:

void setup() {
 // put your setup code here, to run once:
 Serial.begin(115200);
 delay(2000);
 char test[20]="";
 test[0]='a';
 test[1]='b';
 test[2]='c';
 test[3]='d';

 Serial.println(test);
}

void loop() {
 // put your main code here, to run repeatedly:

}

Ok, wenn Du meinst, Deine Unkenntnis lauthals verteidigen zu müssen. Nur zu.

Gruß Tommy

Es ist reiner Zufall wenn das geht. Hängt rein davon ab was da gerade im Speicher steht

size_t Print::print(const char str[])
{
  return write(str);
}

size_t write(const char *str) 
{
    if (str == NULL) return 0;
      return write((const uint8_t *)str, strlen(str));
}

Da wird strlen() ausgeführt und das geht schief wenn es nicht richtig terminiert ist

ja, das stimmt völlig. Aber immerhin: Serial.print gibt auch das auch, auch wenn es nicht o-term ist und auch wenn es dann Mist ist.

Und der User braucht sich bei direkten Zuweisungen nicht um \0 zu kümmern, und auch nicht wenn es von strncpy nicht gemacht wird, weil das automatisch richtig funktioniert, und nur darauf wollte ich letzlich hinaus.

auch wenn es nicht o-term ist

Vielleicht lernst du es ja doch noch.

"Hallo" definiert 6 byte, von denen das letzte eine 0 ist. Damit strlen eine 5 liefert.

Jaaa! aber der User braucht die Terminierung nicht eingeben, DAS meinte ich. Auch nicht bei einzelnen Manipulationen:

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(2000);
char test[20]="";
test[0]='a';
test[1]='b';
test[2]='c';
test[3]='d';

Serial.println(test);
}

void loop() {
// put your main code here, to run repeatedly:

}

Und auch sonst, ohne \0, gibt Serial was aus, auch wenn es u.U. Mist ist, aber immerhin: es wird ausgegeben.

Wieder falsch, sorry. Die lokale Variable char test [20] = ""; stellt sicher, dass test [0 ] == 0 Der Rest ist undefiniert. Wenn du also test[0]='X'; solltest du auch eine Endekennung hinzufügen. Oder eine der strxxx Funktionen verwenden. Die machen das für dich.

ja, aber nach

char test [20] = "";

wird ja durch

test[0]='a';
test[1]='b';
test[2]='c';
test[3]='d';

die vormalige Terminierung \0 im Zelle test[ 0] überschrieben, ohne in test[ 4] im beispiel eine neue \0 manuell gesetzt zu haben.

Also stimmt es doch, wie ich es schrieb ;)

Also stimmt es doch, wie ich es schrieb :wink:

Wenn es bei dir funktioniert, dann weil der Speicher von char test [20] noch seit dem letzten Reset 0 war.

Es ist Zufall das das geht. Und hängt wahrscheinlich auch damit zusammen dass da sonst nicht viele Variablen drin sind

char test[4] = "";

unsigned long var1 = 0xFFFFFFFFFFFFFFFF;

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

 test[0] = 't';
 test[1] = 'e';
 test[2] = 's';
 test[3] = 't';
 Serial.println(test);
}

void loop()
{
}