Frage zu Codeschnipsel (Char-Buffer?)

Hallo,
ich habe in meinem Sketch folgenden Codeschnipsel:

  uint8_t bufindex;              //Buffer index, used to keep track of current buffer byte
  uint8_t buf[255];              //Creates the buffer with a length equal to the max length
  char html_zeilen_buf[255];     //Creates the buffer with a length equal to the max length
  int16_t c;

  bufindex = 0;
  if (strstr(filename, ".htm") != 0) {
    //HTML-Dateien muessen besonders behandelt werden...
    while ((c = dataFile.read()) >= 0) {
      html_zeilen_buf[bufindex++] = ((char)c);
      if ((c == '\n') or (c == '\r') or (bufindex == 255)) {
        //ZeilenEnde im array setzen
        html_zeilen_buf[bufindex] = '\0';

        //hier erfolgen noch Änderungen im html_zeilen_buf...

        MyClient.write(html_zeilen_buf);
        bufindex=0;
      }
    }
    dataFile.close();
    if(bufindex > 0) {
      html_zeilen_buf[bufindex] = '\0';
      MyClient.write(html_zeilen_buf);
    }

 
  } else {
    //keine HTML-Datei, also einfach "Buffer fuer Buffer" senden... 
    while ((c = dataFile.read()) >= 0) {
      buf[bufindex++] = ((char)c);
      if (bufindex == 255) {
        MyClient.write(buf, 255);
        bufindex=0;
      }
    }
    dataFile.close();
    if(bufindex > 0) MyClient.write(buf, bufindex);
  }

Der Code ist ein Teil von einem Webserver. Der obere Buffer "html_zeilen_buf" schreibt zeilenweise die HTML-Dateien von der SD-Karte zum Client. Der andere Buffer "buf" schreibt alles, was keine html-Dateien sind (also Bilder usw.) einfach bufferweise zum Client.

Funktioniert. Jetzt möchte ich aber gerne nur einen Buffer verwenden, um RAM zu sparen.
Wenn ich aber nun einfach den "buf" durch den "html_zeilen_buf" ersetze, werden die Bilddateien nicht mehr angezeigt.

Wer kann mir helfen, den "buf" durch den "html_zeilen_buf zu ersetzen?

Vielen Dank und ein frohes Fest an alle.
MfG paulinchen

paulinchen:

//HTML-Dateien muessen besonders behandelt werden...

Das ist Nonsens.

Die Inhalte von HTML-Dateien kannst Du genau so 1:1 rüberpuffern wie die Inhalte von Bild- und anderen -dateien.

Also einfach die Sonderbehandlung für HTML-Dateien und den html_zeilen_buf aus dem Code entfernen und gut.

Hallo,
oben im Code steht:

//hier erfolgen noch Änderungen im html_zeilen_buf...

Damit ist gemeint, daß ich hier noch viele Ersetzungen in der aktuellen HTML-Zeile mache, um z. Bsp. Platzhalter mit aktuellen Werten zu ersetzen.
Daher brauche ich den Buffer "html_zeilen_buf" als Char-array.

Bei den anderen Dateien, welche ich nicht parsen muß, möchte ich halt auch diesen Buffer nutzen...

Viele Grüße, paulinchen

paulinchen:
Daher brauche ich den Buffer "html_zeilen_buf" als Char-array.

Du brauchst also zwei Datenpuffer, die aber nur einmal Speicherplatz belegen sollen, und einmal möchtest Du den Datenpuffer als Char-array und einmal als uint8_t-Array ansprechen können?

Dann wäre meine erste Idee, den zweiten Puffer als Pointer auf den ersten Puffer zu deklarieren, mit entsprechendem Datentyp.

Also statt:
uint8_t buf[255]; //Creates the buffer with a length equal to the max length
char html_zeilen_buf[255]; //Creates the buffer with a length equal to the max length
Setze:
char html_zeilen_buf[255]; //Creates the buffer with a length equal to the max length
uint8_t* buf = (uint8_t*) &html_zeilen_buf; // Creates pointer to html_zeilen_buf, re-use the buffer

Ich bin nicht so der Pointer-Jongleur (und kann das jetzt auch nicht so direkt testen), aber ich meine, dass Du dann den Rest des Codes so lassen könntest wie er ist. Kannst Du ja mal ausprobieren.

Das sollte klappen, ABER!! :slight_smile:
Wie immer gibt es bei solchen Tricks einen Haken.
Beide Puffer dürfen IMMER nur nacheinander verwendet werden, nie gleichzeitig. Da beide den gleichen Speicherbereich verwenden würden sich sonst Teile des Codes die Daten gegenseitig überschreiben.
Warum muss buf[] eigentlich vom Typ uint_8 sein? Verwendet wird er doch als char-Puffer -> "buf[bufindex++] = ((char)c);".
Mario.

Hallo,
hier noch eine kurze Rückmeldung von mir:

Funktioniert prima!

Vielen Dank an alle.
Liebe Grüße, paulinchen