Go Down

Topic: "Parser-Array-Abfrage" abbrechen (Read 99 times) previous topic - next topic

Chris72622

May 22, 2019, 11:33 am Last Edit: May 22, 2019, 12:33 pm by Chris72622
Ein Array soll über die Eingabe entsprechender Daten mit sinnvollen Werten befüllt werden.

Ein beispielhaft zu erwartender Befehl lautet z.B. "prio14,3,2,5".

Die zu beschreibende Anzahl der Index soll sich hierbei nach der Anzahl der eingegebenen Daten richten.

Nun zu meinem Problem:

Sobald ab Index 2 eine Null eingegeben wurde soll nur dann die Funktion prio() nicht aufgerufen werden, wenn im Anschluss weitere Zahlen größer als Null eingegeben wurden.

Ein fehlerfhafter Befehl wäre somit z.B. "prio14,3,0,5".

Wie könnte ich den Code aus Eurer Sicht modifizieren/verbessern?

Mit einem einfachen break; scheine ich hier nicht weiterzukommen.

Gruß Chris

Code: [Select]
char* parseString(char* serialBuffer) //String verarbeiten
{
  if (strstr(serialBuffer, "prio") == serialBuffer &&
      getIntFromString(serialBuffer, 1) != 0 &&
      getIntFromString(serialBuffer, 1) <= 30 &&
      getIntFromString(serialBuffer, 2) != 0 &&
      getIntFromString(serialBuffer, 2) <= 8)
  {
    Serial.println("prio");
    byte prioInput[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    byte j = 1;
    for (byte i = 0; i <= 8; i++)
    {
      j = getIntFromString(serialBuffer, i + 1);
      prioInput[i] = j;
    }
    prio(prioInput);
  }
  else if (strcmp(serialBuffer, "") != 0)
  {
    Serial.print("\"");
    Serial.print(serialBuffer);
    Serial.println("\" ist ein unbekanntes Kommando.");
  }
}

int getIntFromString (char *stringWithInt, byte num) // Zieht der Reihe nach einzelne Integer aus dem String
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
  char *tail;
  while (num > 0)
  {
    num--;
    while ((!isdigit (*stringWithInt)) && (*stringWithInt != 0)) stringWithInt++; // skip non-digits
    tail = stringWithInt;
    while ((isdigit(*tail)) && (*tail != 0)) tail++; // find digits
    if (num > 0) stringWithInt = tail; // new search string is the string after that number
  }
  return (strtol(stringWithInt, &tail, 0));
}
Bilnk wtiohut daley.

Tommy56

Ich würde mit einem Endezeichen, z.B. '\n' arbeiten, um zu erkennen, wenn die Eingabe fertig ist. Bis dahin alles in einen Puffer schreiben und bei '\n' mit '\0' abschließen.
Weiterhin zwischen "prio" und dem 1. Parameter (14) ebenfalls ein Trennzeichen setzen und dann die Teile mit strtok trennen. Infos dazu gibt es hier.
Dabei als erstes den Befehl ermittel (prio) und dann die Parameter einlesen. Dabei oder danach die Bedingungsprüfung durchführen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Chris72622

Bilnk wtiohut daley.

Go Up