mikrocontroller.net

Forum: Compiler & IDEs Array löschen und kopieren


Autor: Johannes G. (johannesg00)
Datum:

Bewertung
0 lesenswert
nicht 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?
int8_t buffer1[100] = {0};
int8_t buffer2[100] = {0};

uint_t i = 0;

while(i <= 100)
{
   buffer2[i] = buffer1[i];
   buffer1[i] = 0;
   i++;
}

Oder gibt es da eine elegantere Möglichkeit?

Viele Grüße,
   Johannes

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

Bewertung
0 lesenswert
nicht 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?
  strcpy( buffer2, buffer1 );
  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.

int8_t buffer1[100] = {0};
int8_t buffer2[100] = {0};

int8_t nextBufferPosToStore = 0;

int8_t* collectBuffer = buffer1;
int8_t* evaluateBuffer = buffer2;

[c]
   ...

   if( nextCharacter == '\n' ) {
     int8_t* tmpSwap;

     collectBuffer[ nextBufferPosToStore] = '\0';  // String abschliessen
     tmpSwap = collectBuffer;                      // und die BufferPointer tauschen
     collectBuffer = evaluateBuffer;
     evaluateBuffer = tmpSwap;
     nextBufferPosToStore = 0;                     // und es geht wieder von vorne los
   }

   else
                                             // kein Zeilenende. Zeichen einfach hamstern
     collectBuffer[nextBufferPosToStore++] = nextChar; 

Autor: Johannes G. (johannesg00)
Datum:

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

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

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

Autor: Johannes G. (johannesg00)
Datum:

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

Autor: NurEinGast (Gast)
Datum:

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

Autor: Johannes G. (johannesg00)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, das habe ich total übersehen, danke :)

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.