Byte aus Array auslesen, Welches durch Zeiger + Zeichennummer übergeben wird

Hi

So, habe etwas gespielt, rausgekommen sind die Ausgabe mehrerer Arrays per Zeiger, wie im loop() die Prüfung der Eingaben via Terminal an mehreren Sequenzen wie Deren Fund - oder eben nicht.

#Array,#Zeiger,#Pointer,#Arduino :slight_smile:

//void printarray(byte *pointer);  //wird wohl automatisch von der IDE erstellt

byte test = 137;
byte *pointer = &test;          //pointer zeigt auf Speicherstelle von test
byte testarray[] = {101, 202, 22, 66, 78,0}; // Null angehangen, da sonst Endprüfung fehlerhaft!!
byte *arraypointer2 = testarray;     //arraypointer zeigt auf Speicherstelle von testarray[0], da testarray selber schon ein Zeiger auf das erste Array-Element ist, entfällt das & (??)
byte *arraypointer3 = &testarray[0]; //arraypointer zeigt auf Speicherstelle von testarray[0]

//Sequenzen, Die im Eingabestrom gefunden werden sollen
const byte test1[] = {'H', 'a', 'l', 'l', 'o'};
const byte test2[] = {'B', 'a', 'l', 'l', 'o'};
const byte test3[] = {'T', 'e', 's', 't'};
const byte test4[] = {'T', 'e', 's', 't', '2'};
const byte test5[] = {'H', 'a', 'l', 'l', 'o', 'e', 'l', 'e'};

typedef struct {                   // Erstellen des Datentyp 'sequenzen'
  const byte laenge;            //Länge der zu suchenden Sequenz
  const byte *pointer;          //dort ist der Anfang der Sequenz
  byte bereitsgefunden;       //aktuell zu Testendes Byte aus der Sequenz, änderbar
  const byte folgebytes;      //wenn wir die Sequenz gefunden haben, noch x Byte einlesen (hier nicht benutzt)
} sequenzen;

sequenzen sequenz[] = {    //Anlegen der 5 zu testenden Sequenzen sequenz[0...5] im Datentyp sequenzen
  {sizeof(test1) / sizeof(test1[0]), &test1[0], 0, 0},
  {sizeof(test2) / sizeof(test2[0]), &test2[0], 0, 0},
  {sizeof(test3) / sizeof(test3[0]), &test3[0], 0, 0},
  {sizeof(test4) / sizeof(test4[0]), &test4[0], 0, 0},
  {sizeof(test5) / sizeof(test5[0]), &test5[0], 0, 0},
};


void setup() {
  Serial.begin(9600);                     //Serielle Schnittstelle mit xxx Baud öffnen
  Serial.print("*poniter=");              //und diverses Zeug ausgeben
  Serial.println(*pointer);                //die Byte-Variable
  Serial.print("*arrayponiter2=");
  Serial.println(*arraypointer2);       //das erste Element des Array
  Serial.print("*arrayponiter3=");
  Serial.println(*arraypointer3);       //ernuet das erste Element des Array

  Serial.println("Original-Array");    //Ausgabe des Array-Inhalt über das Array selber
  byte i = 0;
  while (testarray[i]) {
    Serial.print(testarray[i]);
    Serial.print(" ");
    i++;
  }
  Serial.println();

  Serial.println("Zeiger auf Byte-Variable");  //die Byte-Variable
  Serial.print(*pointer);
  Serial.println();

  Serial.println("Zeiger auf Array-Name");   //das Array über den Zeiger auf den Array-Namen
  i = 0;
  while (*(arraypointer2 + i)) {
    Serial.print(*(arraypointer2 + i));
    Serial.print(" ");
    i++;
  }
  Serial.println();

  Serial.println("Zeiger auf Array[0]");        //das Array über den Zeiger auf das erste Array-Element
  i = 0;
  while (*(arraypointer3 + i)) {
    Serial.print(*(arraypointer3 + i));
    Serial.print(" ");
    i++;
  }
  Serial.println();

  Serial.println("Funktionsaufruf arraypointer2");   //Ausgabe des Array per Funktion durch Übergabe des Zeiger auf den Namen
  printarray(arraypointer2);
  Serial.println("Funktionsaufruf arraypointer3");   //Ausgabe des Array per Funktion durch Übergabe des Zeiger auf das erste Element
  printarray(arraypointer3);
}

void loop() {
  if (Serial.available()) {
    //Es wurde mindestens ein Zeichen übergeben
    //Hier alle Sequenzen durchprüfen, ob das nächste Zeichen dieser Sequenz dem Übergebenem entspricht
    byte a = Serial.read();     //Zeichen einlesen
    if (a >= 0x20) {            //Wenn kein Steuerzeichen, dann Prüfen (da zum Test Eingabe via Terminal)
      Serial.print("Eingelesen: ");
      Serial.write(a);
      Serial.println();
      for (byte i = 0; i < sizeof(sequenz) / sizeof(sequenz[0]); i++) { //alle Sequenzen durchprüfen
        boolean rescan = 0;               //bei Abbruch wird diese Sequenz erneut getestet, ob das Zeichen das Startzeichen ist
        Serial.print("Teste Sequenz ");
        Serial.print(i);
        if (*(sequenz[i].pointer + sequenz[i].bereitsgefunden) == a) {  //stimmt das Zeichen überein
          Serial.print("*");
          if (sequenz[i].bereitsgefunden == sequenz[i].laenge - 1) {    //sind wir am Ende der Sequenz? -1, da der Index bei 0 beginnt, die Länge aber bei 1
            Serial.print(" gefunden");                                  //ja, Erkennung wieder von Vorne
            sequenz[i].bereitsgefunden = 0;
          } else {
            sequenz[i].bereitsgefunden++;                               //nein, auf nächstes Zeichen stellen
          }
        } else {
          if (sequenz[i].bereitsgefunden != 0) {                        //unpassendes Zeichen gefunden - Das passt aber vll. am Anfang
            rescan = 1;                                                 // -> neu Prüfen (Schleife mit gleichem Wert erneut durchlaufen)
          }
          sequenz[i].bereitsgefunden = 0;                               //zu Prüfendes Zeichen auf Anfang stellen
        }
        Serial.print(" (");                                             //Anzeigen der zu Prüfenden Stelle
        Serial.print(sequenz[i].bereitsgefunden);
        Serial.println(")");
        if (rescan) i--;  //Schleife erneut durchlaufen                 //bei erneuter Prüfung die Zähl-Variable um 1 verringern
      }
    }
  }
}

void printarray(byte *pointer) {  //Übergabe des Byte-Pointer - mir fiel auf, daß 'byte* pointer' und 'byte * pointer' ebenfalls klappt, gerade Letzteres sollte man aber, laut Buch (C++ Entwicklung mit Linux) unterlassen
  byte i = 0;                           //Offset auf 0
  while (*(pointer + i)) {           //solange kein Null-Byte gelesen wurde
    Serial.print(*(pointer + i));   //Zeichen-Code ausgeben
    Serial.print(" ");                 //Leerzeichen für bessere Übersicht
    i++;                                 //Offset erhöhen
  }
  Serial.println();                    //neue Zeile
}

Denke, So ungefähr wollte ich Das haben.
Ich denke allerdings auch, daß meine Prüfung auf das Ende des Array in der Funktion printarray() zumindest unsauber ist, da ich dem Array nicht explizit eine Null anhänge, um das Ende zu markieren - klappt aber trotzdem - warum?
Theoretisch müsste sich doch die Byte-Variable direkt hinter dem Array finden lassen (wobei ich noch nicht heraus bekommen habe, wie ich mir die Werte der Zeiger anzeigen lassen kann).
Öh - hatte zuvor das Byte nach dem Array erst deklariert - macht aber keinen Unterschied (gerade erst gesehen, daß das Array 'das Letzte' ist, somit ist eine Null dahinter wahrscheinlich, oder?
--> Kaum probiert man etwas herum, schon klappt die Ende-Erkennung nicht mehr - denke, habe 'Überreste' im Speicher.
Also entweder über Anhängen einer Null, oder Mithalten der Länge!!

Besten Dank schon Mal für Eure Unterstützung bis hier hin.
Vll. kann ja Wer dieses Pointer-Beispiel gebrauchen - selber denke ich, auf dem richtigen Weg zu sein.

MfG