Adafruit Fingerprint Sensor Verständnisfrage

Hallo,

ich bin gerade dabei die Adafruit Fingerprint Sensor Library als component für die ESP32 idf zu portieren.

Empfangen und Senden klappt soweit schon.
Allerdings begreife ich die Funktion: uint8_t Adafruit_Fingerprint::getReply(uint8_t packet[], uint16_t timeout) nicht so ganz.

Wenn ich mir zum Beispiel den Aufruf aus dieser Funktion anschaue:

boolean Adafruit_Fingerprint::verifyPassword(void) {
  uint8_t packet[] = {FINGERPRINT_VERIFYPASSWORD, 
                      (thePassword >> 24), (thePassword >> 16),
                      (thePassword >> 8), thePassword};
  writePacket(theAddress, FINGERPRINT_COMMANDPACKET, 7, packet);
  uint8_t len = getReply(recvPacket);     //Aufruf mit Übergabe recvPacket - globale Variable!
  
  if ((len == 1) && (recvPacket[0] == FINGERPRINT_ACKPACKET) && (recvPacket[1] == FINGERPRINT_OK))      //woher kommt hier der Wert in recvPacket[0] bzw. recvPacket[1]?
    return true;

/*
  Serial.print("\nGot packet type "); Serial.print(packet[0]);
  for (uint8_t i=1; i<len+1;i++) {
    Serial.print(" 0x");
    Serial.print(packet[i], HEX);
  }
  */
  return false;
}

Ich versteh den Aufruf der Funktion nicht…
Die Variable Packet wird in der getReply-Funktion zwar beschrieben:

packet[0] = packettype;      
      for (uint8_t i=0; i<len; i++) {
        packet[1+i] = reply[9+i];
      }
  • wird aber nicht returned und ist von außen daher doch nie zugänglich? Der Wert ist nach verlassen der Funktion doch gleich wieder dahin…?
    Ich versteh den Sinn dahinter einfach nicht :o :confused:

Genauso wie die Abfrage innerhalb der verifyPassword-Funktion:

if ((len == 1) && (recvPacket[0] == FINGERPRINT_ACKPACKET) && (recvPacket[1] == FINGERPRINT_OK))
    return true;

Woher zum Teufel bekommt recvPacket seinen Inhalt her? Dieses Array ist in der header Datei global definiert, kann daher auch innerhalb der verifyPassword-Funktion genutzt werden.
Aber: Wo wird diese Variable denn beschrieben? Ich denke mal, dass sollte in der getReply-Funktion passieren…hier wird die Variable aber nicht einmal verwendet?!

Zu guter Letzt erschließt sich mir der Rückgabewert “len” in der getReply-Funktion nicht ganz.
Wenn das “Grundpaket” mit Adresse usw. angekommen ist, kann “len” doch immer nur 1 sein?
Außerdem fehlt das Berechnen und Prüfen der Checksumme?

Danke und Gruß
Danie

Das ist ein Grund weshalb man Arrays eher so übergeben sollte:

uint8_t Adafruit_Fingerprint::getReply(uint8_t* packet, uint16_t timeout)

Dann ist klar dass hier ein Zeiger übergeben wird

geht natürlich auch. Das Array zerfällt in einen Zeiger. Also call by reference.
Merke: Array-Variablen sind in C/C++ nicht viel mehr als Zeiger auf das erste Element

geht natürlich auch

Bei Verwendung als Funktionsparameter ist beides exakt dasselbe.

  • In beiden Fällen ist die Array-Größe unbekannt
  • In beiden Fallen kann auf die eigentlichen Daten auf beide Arten zugegriffen werden:x[ i ]oder *(x+i)
    Es gibt natürlich Fälle, wo der Unterschied sichtbar wird:
char *x = "Text1";
char y[] = "Text2";
void setup() {
 Serial.begin(9600);
 Serial.println(sizeof(x));  // 2
 Serial.println(sizeof(y));  // 6
 x+=3;
 // y+=3;  // (Geht nicht) error: incompatible types in assignment of 'int' to 'char [6]'
 Serial.println(x);   // "t1"
 Serial.println(y+3);   // "t2"  (Dies geht)
 x = y+3; // auch ok
 Serial.println(x);   // "t2"
}

void loop() { }

michael_x:
Bei Verwendung als Funktionsparameter ist beides exakt dasselbe.

Das ist mir klar. Ich finde es aber als Benutzer deutlicher gleich Zeiger zu verwenden. Das sieht man auch häufiger.
Dass Arrays in C++ keine Objekte sind und nicht als Wert übergeben werden sollte man aber so oder so wissen