Flexible SplitText() Klasse (Anfänger)

OP #7894097
Lesenswert?

Hallo zusammen,

nachdem mein letzter thread Beitrag "Anfänger-Entwicklung einer Gärbox Steuerung" zu Recht völlig in die Hosen ging (so wie ich das vorhatte, geht das eben nicht ...) und mir der Beitrag von Manfred Beitrag "Re: Anfänger-Entwicklung einer Gärbox Steuerung" schwer zu denken gab, hatte ich hier erst mal Pause gemacht.

Vor Kurzem wieder häufiger daran weitergebastelt und jetzt ist als etwas Sichtbares und ggfs. Brauchbares die erste Arbeitsversion einer flexiblen SplitText() Klasse dabei herausgekommen (ich denke, das ist das passende Unterforum hierfür).

Vielleicht kann das ja jemand gebrauchen - es gibt davon natürlich grob geschätzt Tausende davon...

Das Grundlegende:

  • Eingabe von Text, Delimiter, geschützt oder ungeschützt (die Bytefolge zwischen den Delimitern incl. der Delimiter selbst)
  • Text max. Länge auf 250 Byte definiert
  • Textspeicherung in reserviertem Arduino-String, der nur gelesen wird
  • Return-Wert lediglich als Integer Paar für nachfolgende lesende SW-Elemente. Das Integer Paar enthält zwei Indizes, Start und Ende des gefuundenen 'Wortes'.
  • Der Aufruf von splitText.getNextSplitPositions() wird so oft durchgeführt, bis kein Wort (Indices) mehr zurückkommt. Die korrekte Rückgabe von (-1, -1) für "nichts mehr zu holen" checke ich noch genauer.
  • Falls geschützte Delimiter verwendet werden, um irgendwelche Bytefolgen als zusammenhängende Einheit zu schützen, ist ein zwei-Phasen Durchgang erforderlich. 1) Für ungeschützt / geschützte Bereiche 2) Für jeden Bereich dann nach Bedarf das Splitten.

Der Sketch ist in der aktuellen Version nicht vollstädig ausgetestet und wird bei nächster Gelegenheit etwas optimiert.

Er sollte laufen (bei mir auf WIN10), wenn die Dateien Arduino-korrekt in ./sketches und ./sketches/defaults_user_settings kopiert sind.

Grüße Uli

Ganz vergessen: Jegliche Anregung ist willkommen!

Angehängte Dateien:
Beitrag #7894104 wurde von einem Moderator gelöscht.
OP #7896623
Lesenswert?

Peter D. schrieb:

https://www.c-howto.de/tutorial/strings-zeichenketten/string-funktionen/string-zerteilen/

Ja, danke! Da sehe ich mal wieder, WIE kompakt C/C++ code geschrieben werden kann - das Meine ist klar Pillepalle für die Meisten von euch ...

Es bingt mir im jetzigen Stadium aber mehr und auch mehr Spass, als Anfänger 'das Rad neu zu erfinden'.

Nach dem ersten Blick darauf:

  • das ist für mich bereits kaum bis schwer lesbar
  • ich möchte als Anfänger String verwenden, wo immer das keinen deutlichen Nachteil bedeutet
  • Meine Version ändert den String nicht, er wird nur gelesen und bleibt static sowie reserviert im Speicher, weil er ziemlich lang sein kann (Arduino Speicher)

Worum es mir auch ganz entscheidend geht: So richtig verrennen möchte ich mich nicht mehr in der Gesamtstruktur /-aufbau (Sketch/Modul sowie durch einen Schalter einbindbar als .cpp). Sonst fange ich das gefühlt hunderste Mal an...

Einen neuen Kern-Algoritmus stelle ich demnächst hier ein. Er ist etwas kompakter.

Grüße Uli

P.S.: Falls ihr denkt, dass dies das falsche Forum dafür ist, bitte ich um entsprechende Info.

OP #7896695
Lesenswert?

Matthias S. schrieb:

Uli schrieb:

Falls ihr denkt, dass dies das falsche Forum dafür ist, bitte ich um entsprechende Info.

Ist es, siehe: https://www.mikrocontroller.net/forum/codesammlung ganz oben.

Hmm - hatte mir das genau angschaut und bin auf keinen besseren Reim gekommen. "Codeschnipsel" war wohl der entscheidende Begriff.

Bin immer noch unsicher...

Gäbe es denn auf mikrocontroller.net ein passenderes Forum dafür?

OP #7911236
Lesenswert?

Hallo zusammen, zur Erinnerung:

Anfänger, Arduino bzw. ESP8266 Umgebung.

Jetzt ist die Hauptmethode intuitiver und etwas kompakter. Die Hauptunterschiede sind:

  • Nur noch ein-Pass erforderlich (für geschützte UND 'normale' Split-Bereiche)
  • Es kann bei Bedarf 'üblich' geschriebener Text geparst werden

Die Vorteile für die genannte Umgebung bleiben erhalten:

  • Nutzung von reserved String zur Vermeidung von HEAP-Proplemen
  • Übergabe (return-Werte) lediglich der Anfangs- und Endposition der Sektionen als Intgeger

Die Kern-Methode sieht nun so aus:

1
std::pair<int, int> getNextSplitPositions() {
2
  bool isDoubleDelimiter = false;
3
  String doubleDelimiter = String(delimiterChar) + String(delimiterChar);
4

5
  if (freshJobDataReceived) { 
6
    freshJobDataReceived = false;
7
    coreIndex            = 0    ;
8
  }
9

10
  if (coreIndex >= textToSplitLen) {
11
    return std::make_pair(-1, -1);
12
  }
13

14
  if (textToSplit.charAt(coreIndex) == delimiterChar) {
15
    coreIndex++;
16

17
    if (textToSplit.charAt(coreIndex) == delimiterChar) {
18
      isDoubleDelimiter = true;
19
      coreIndex++;
20
    }
21
  }
22

23
  retStart = coreIndex;
24

25
  while (true) {
26
    if (isDoubleDelimiter == true) {
27
      coreIndex = textToSplit.indexOf(doubleDelimiter, coreIndex);
28
    } else if (textToSplit.charAt(coreIndex) != delimiterChar && 
29
      coreIndex < textToSplitLen) {
30
      coreIndex++;
31
      continue;
32
    }
33

34
    retEnd = coreIndex;
35

36
    if (isDoubleDelimiter) {
37
      retStart  = retStart -2;
38
      retEnd    = retEnd   +2;
39
      coreIndex = retEnd;
40
    } else {
41
      // NOOP
42
    }
43

44
    if (retStart == retEnd && retStart == textToSplitLen) {
45
      return std::make_pair(-1, -1);
46
    }
47

48
    return  std::make_pair(retStart, retEnd);
49
  }
50

51
  errorType = 1; // WARN
52
  return std::make_pair(-1, -1);
53
}

Der ausführbare Sketch ist einschl. der drei Headerdateien angehängt (als Standalone).

Es wäre toll und würde mir als Anfänger sehr helfen, wenn es konstruktive Kritik von den Profis gäbe!

Viele Grüße Uli

OP #7922354
Lesenswert?

Hallo zusammen,

das 'falsche' Forum ... Ja und nein - es tummelt sich hier lediglich und verständlicherweise niemand, der sich auch für Anfänger-Code interessiert.

Würde mich doch noch sehr freuen, wenn wenigstens einer von euch sagen könnte, ob ich mich auf dem 'richtigen' Weg befinde oder schon wieder alles neu aufsetzen muss :-(

Danach bin ich auch wieder wech von hier und gehe mit dem aktuellen Ansatz evtl. zurück zum bisherigen Forum.

Danke für alle Beiträge - aus jedem konnte ich etwas Hilfreiches entnehmen!

Grüße Uli

P.S.: Sollte eigentlich als Sketch in diesem Zustand laufen

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren