Forum: Compiler & IDEs Array löschen und kopieren


von Johannes G. (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:
Ich habe einen ATmega, der per UART mit einem Gerät kommuniziert.
Alles was er empfängt schreibt er in einen Buffer (also in ein Array)
Wenn er nun ein \n empfängt soll er das Array in ein anderes kopieren 
und den Buffer löschen. Wie mache ich das am effektivsten?
Einfach so?
1
int8_t buffer1[100] = {0};
2
int8_t buffer2[100] = {0};
3
4
uint_t i = 0;
5
6
while(i <= 100)
7
{
8
   buffer2[i] = buffer1[i];
9
   buffer1[i] = 0;
10
   i++;
11
}

Oder gibt es da eine elegantere Möglichkeit?

Viele Grüße,
   Johannes

von Karl H. (kbuchegg)


Lesenswert?

Johannes G. schrieb:
> Hallo,
>
> ich habe folgendes Problem:
> Ich habe einen ATmega, der per UART mit einem Gerät kommuniziert.
> Alles was er empfängt schreibt er in einen Buffer (also in ein Array)
> Wenn er nun ein \n empfängt

Ich schliesse daraus, dass wir nur über Texte reden, oder?

> soll er das Array in ein anderes kopieren
> und den Buffer löschen. Wie mache ich das am effektivsten?
> Einfach so?
1
  strcpy( buffer2, buffer1 );
2
  buffer1[0] = '\0';


Die effektivste Möglichkeit ist allerdings gar nichts umzukopieren, 
sondern einfach die Bedeutung der Buffer zu tauschen.
Während in buffer1 empfangen wird, wird buffer2 ausgewertet (sofern 
etwas auswertbares drinnen ist)

Kommt das \n wird umgeschaltet. buffer1 wird zum Auswertebuffer erklärt, 
während buffer2 die Rolle des 'Datensammlers' übernimmt. Beim nächsten 
\n wird dann wieder getauscht.

1
int8_t buffer1[100] = {0};
2
int8_t buffer2[100] = {0};
3
4
int8_t nextBufferPosToStore = 0;
5
6
int8_t* collectBuffer = buffer1;
7
int8_t* evaluateBuffer = buffer2;
8
9
[c]
10
   ...
11
12
   if( nextCharacter == '\n' ) {
13
     int8_t* tmpSwap;
14
15
     collectBuffer[ nextBufferPosToStore] = '\0';  // String abschliessen
16
     tmpSwap = collectBuffer;                      // und die BufferPointer tauschen
17
     collectBuffer = evaluateBuffer;
18
     evaluateBuffer = tmpSwap;
19
     nextBufferPosToStore = 0;                     // und es geht wieder von vorne los
20
   }
21
22
   else
23
                                             // kein Zeilenende. Zeichen einfach hamstern
24
     collectBuffer[nextBufferPosToStore++] = nextChar;

von Johannes G. (Gast)


Lesenswert?

Hallo,

ja, wir reden über strings ;)
Danke für deinen Tipp :)
Darauf bin ich nicht gekommen... Aber das wäre warscheinlich das 
effektivste..
Wieso schließt du den String dann noch mit "\0" ab? Eigentlich braucht 
man das doch nicht oder?

Viele Grüße,
   Johannes

von Karl H. (kbuchegg)


Lesenswert?

Johannes G. schrieb:
> Hallo,
>
> ja, wir reden über strings ;)
> Danke für deinen Tipp :)
> Darauf bin ich nicht gekommen... Aber das wäre warscheinlich das
> effektivste..
> Wieso schließt du den String dann noch mit "\0" ab? Eigentlich braucht
> man das doch nicht oder?

Jeder String ist in C mit einem \0 abgeschlossen! Und dort wo das \0 
Zeichen ist, ist de String zu Ende. Selbst dann wenn dahinter noch 
Zeichen kommen :-)
Von alleine schliesst sich der String nicht ab, also musst du das tun!

(Du kannst natürlich auch, so wie du da machst, den Buffer zunächst mit 
lauter \0 zumüllen, dann hast du auch auf jeden Fall immer ein \0 
Zeichen am Ende.
Man kann natürlich aber auch einfach nur das 1 \0 Zeichen einsetzen, 
wenn es benötigt wird und nicht den Rundumschlag 'Buffer mit \0 füllen' 
machen.

Ist ein bischen pervers, wenn du auf der einen Seite nach Effizienz 
schreist und auf der anderen Seite 99 völlig unnötige Zuweisungen 
machst.

von Johannes G. (Gast)


Lesenswert?

Hallo,

ich wollte die Strings ja noch weiterverwenden, daher hab ich gedacht, 
ich muss sie nicht mit \0 abschließen, weil ich sie eh nicht wieder per 
UART ausgebe oder sowas ;)
Aber danke für die Erklärung :)

von NurEinGast (Gast)


Lesenswert?

Nebenbei bemerkt :

Du erzeugst ein Array mit 100 Elementen
    int8_t buffer1[100] = {0};

Und benutzt 101 Elemente 0..100 = 101 Elemente kopieren
    while(i <= 100)

Damit überschreibst Du Deinen Arbeitsspeicher.

von Johannes G. (Gast)


Lesenswert?

Oh, das habe ich total übersehen, danke :)

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
Noch kein Account? Hier anmelden.