Stringformatierung

Gast #471523
Lesenswert?

hallo zusammen.
hatte am wochenende schon einmal einen beitrag gepostet, doch leider bin 
ich noch nicht weiter gekommen...
also ich habe einen string: "1 xxx; 2 xxx; 3 xxx; 4 xxx_"
wie kann ich diesen formatieren, damit ich später folgende zuweisungen 
machen kann: motor1 = xxx, motor2 = xxx, etc. (xxx steht für den 
pwm-wert)

würde mich sehr über beispielcode freuen.

gruß
  Floyd
Gast #471540
Lesenswert?

das stimmt! fand deine antwort auch sehr interessant, doch ich hab mich 
schon auf die andere lösung eingestellt... - das weitere programm 
verlangt diese auswertung.

weißt du, wie die von mir vorgestellte lösung aussieht?
#471558
Lesenswert?

> also ich habe einen string: "1 xxx; 2 xxx; 3 xxx; 4 xxx_"
> wie kann ich diesen formatieren,

Fang mal damit an die richtige Nomenklatur zu benutzen.
Du willst nicht den String formatieren sondern zu willst
den String parsen.

  Formatieren: Den String nach bestimmten Regeln aufbauen
               -> Werte gegeben; String wird aufgebaut

  Parsen: Den String nach bestimmten Regeln auswerten
               -> String gegeben; Werte gesucht

Und so eine State-Maschine wie sie im anderen Post
besprochen wurde ist gar keine so schlechte Idee.

Du gehst den String Zeichen für Zeichen durch und die
State Maschine ändert ihren Zustand, jenachdem welches
Zeichen angetroffen wurde. Das ist nun wirklich nicht
schwierig.
1
  ...
2
  // Eine Zeile wurde komplett vom Sender übertragen
3
  // Die kann zb so aussehen
4
  // y = xxx; y = xxx;
5
  //
6
  // y    ... Nummer der PWM die zu setzen ist
7
  // xxx  ... PWM Wert der zu setzen ist
8
  // ;    ... Kennzeichnung, dass die PWM Message hier zu Ende ist
9
  // 
10
  //
11
  // Eine Zeile vom Sender besteht also aus mehreren PWM Messages.
12
  // Eine PWM Message besteht aus (in der Reihenfolge)
13
  //   Einer Zahl, die die Nummer der PWM Einheit darstellt
14
  //   Einem '='
15
  //   Noch einer Zahl, die den zu setzenden Wert darstellt
16
  //   Einem ';', welches die Message abschliesst.
17

18

19
#define START_PWM_MSG  0    // Maschine wartet auf den Beginn einer PWM Message
20
#define FIND_EQUALS    1    // Maschine wartet auf ein '=' Zeichen
21
#define GET_VALUE      2    // Maschine liest den Zahlenwert
22
#define FIND_SEMICOLON 3    // Maschine wartet auf ein ';' Zeichen
23

24
  // Mit Ausnahme des Zustands FIND_SEMIOLON weiss die Maschine immer, was als
25
  // nächstes kommen muss. Wird das Erwartete nicht vorgefunden, geht die
26
  // Maschine sofort in den Zustand FIND_SEMICOLON über, bei dem Zeichen
27
  // überlesen werden, bis ein ';' angetroffen wird. Der Zustand FIND_SEMICOLON
28
  // fungiert als ein Art 'Wiederaufsetzen nach einem Fehler'
29

30
  //
31
  // Am Anfang ist die Maschine im Zustand:
32
  // Wir warten auf den Anfang einer PWM Message
33
  //
34
  State = START_PWM_MSG;
35
  PWM_Unit = 0;
36
  PWM_Value = 0;
37

38
  Index = 0;
39
  while( Input[Index] != Dein_Ende_Zeichen für eine Zeile ) {
40
    NextChar = Input[Index++];
41

42
    //
43
    // Whitespace Zeichen werden, egal wo sie auftreten, ignoriert
44
    if( NextChar == ' ' ||
45
        NextChar == '\t' ||
46
        NextChar == '\n' )
47
      continue;
48

49

50
    switch( State ) {
51
      case START_PWM_MSG:    // Das nächste Zeichen muss eine Zahl sein, wenn nicht
52
                             // Fehler: Alles bis zum ';' ignorieren
53

54
        if( NextChar >= '0' && NextChar <= '9' ) {
55
          PWM_Unit = NextChar - '0';
56
          State = FIND_EQUALS;
57
        }
58
        else
59
          State = FIND_SEMICOLON;
60
        break;
61

62
      case FIND_EQUALS:
63
        if( NextChar == '=' )
64
          State = GET_VALUE;
65
        else
66
          State = FIND_SEMICOLON;
67
        break;
68

69
      case GET_VALUE:
70
        if( NextChar >= '0' && NextChar <= '9' )
71
          PWM_Value = 10 * PWM_Value + ( NextChar - '0' );
72

73
        else if( NextChar == ';' ) {
74
          // Eine Message wurde komplett und fehlerfrei empfangen
75
          // Setze die Werte
76
          SetPwm( PWM_Unit, PWM_Value );
77
 
78
          // und die Maschine wieder auf Anfang zurückstellen
79
          State = START_PWM_MSG;
80
          PWM_Unit = 0;
81
          PWM_Value = 0;
82
        }
83

84
        else
85
          // Fehler. Dieses Zeichen ist weder das abschliessende ';'
86
          // noch etwas im Bereich '0' bis '9'
87
          State = FIND_SEMICOLON
88

89
        break;
90

91
      case FIND_SEMICOLON:
92
        if( NextChar == ';' ) {
93
          State = START_PWM_MSG;
94
          PWM_Unit = 0;
95
          PWM_Value = 0;
96
        }
97
    }

Der Code ist ungetestet. Die Grundstruktur sollte stimmen,
möglicherweise sind ein paar Tippfehler drinnen.
#471602
Lesenswert?

Und so sieht dann die State Maschine aus, wenn man
in der Planungsphase ist.
Mit so einem Schaubild fängt man an.

Jeder Kreis symbolisiert einen Zustand.
Jeder Pfeil ist ein Übergang von einem Zustand
zu einem anderen Zustand. Bei jedem Pfeil steht dabei
unter welchen Bedingungen dieser Übergang genommen
wird (hier: der rote Text. zu lesen als: nächstes
Zeichen muss sein ...) und welche Aktionen bei der
Wahl dieses Übergangs ausgeführt werden (in Blau)


Interessant ist übrigens, dass die State Maschine einfacher
wird, wenn man die Beschränkung, dass die PWM Nummer nur
einstellig sein kann, weglässt. Dann fällt der Zustand
FIND_EQUALS komplett raus.
Ist aber eine Übungsaufgabe für den Leser.
Angehängte Dateien:
Gast #471689
Lesenswert?

vielen dank für die ausführlichen antworten! jetzt erst verstehe ich die 
zustandsmodelle.
hat der string die form ";1=xxx; 2=xxx; 3=xxx; 4=xxx;_", dann läuft das 
programm vollständig durch. modifiziere jetzt noch den vom pc gesendeten 
string - an das c-programmieren werde ich mich wohl noch gewöhnen 
müssen.

DANKE!

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