Arduino: liste concatenate

Ciao,

in questo post vedremo come utilizzare le liste concatenate con Arduino.


ma prima: cosa sono le liste concatenate? 

da wikipedia:

In informatica, una lista concatenata (o linked list) è una struttura dati dinamica, tra quelle fondamentali usate nella programmazione. Consiste di una sequenza di nodi, ognuno contenente campi di dati arbitrari ed uno o due riferimenti ("link") che puntano al nodo successivo e/o precedente. Una lista concatenata è un tipo di dato auto-referente, in quanto contiene un puntatore ad un altro dato dello stesso tipo. Le liste concatenate permettono l'inserzione e la rimozione di nodi in ogni punto della lista in tempo costante, ma non permettono l'accesso casuale, solo quello sequenziale. Esistono diversi tipi di liste concatenate: liste concatenate semplici, liste concatenate doppie e liste circolari.

Quando non si conosce a priori l'esatta quantità di dati da immagazzinare può essere conveniente utilizzare una lista rispetto ad un array, nel quale va prestabilita la dimensione. 

Ad esempio "int mInts[100]" occuperà sempre 100 int, anche se durante l'esecuzione potrebbero servirmene solo 10. Di contro se so già la dimensione certa potrebbe essere molto più vantaggioso l'array, sia come spazio occupato sia come velocità di accesso ai dati. 

La libreria LinkedList implementa l'utilizzo delle liste concatenate con Arduino, è possibile scaricarla ed installarla tramite il gestore librerie dal menu di Arduino.




Ecco qui un esempio pratico di uso delle liste.

Una scheda SD collegata ad una scheda di sviluppo basata su ESP32, non potendo conoscere a priori il numero di file e cartelle, è impossibile costruire a priori un array della lunghezza adeguata nel quale inserire tutti i nomi delle cartelle trovate nella SD (ad esempio). Con le liste concatenate invece è possibile fare ciò senza dover riservare a prescindere spazio.

  1. #include <LinkedList.h>
  2. #include "SD.h"
  3. #include "FS.h"
  4.  
  5. // Digital I/O used
  6. #define SD_CS          5
  7. #define SPI_MOSI      23    // SD Card
  8. #define SPI_MISO      19
  9. #define SPI_SCK       18
  10.  
  11. File root;
  12.  
  13. LinkedList<String> foldersList = LinkedList<String>();
  14.  
  15. void setup() {
  16.   delay(2000);
  17.   pinMode(SD_CS, OUTPUT);
  18.   digitalWrite(SD_CS, HIGH);
  19.   SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
  20.   Serial.begin(115200);
  21.  
  22.   if (!SD.begin(SD_CS))
  23.   {
  24.     Serial.println("Error talking to SD card!");
  25.     ESP.restart();  //try again
  26.   }
  27.   root = SD.open("/");
  28.   listSubfolders(root);
  29.  
  30.   for (int i = 0; i < foldersList.size(); i++)
  31.   {
  32.     Serial.println(foldersList.get(i));
  33.   }
  34. }
  35.  
  36. void loop() {
  37. }
  38.  
  39. void listSubfolders(File dir) {
  40.   while (true) {
  41.  
  42.     File entry =  dir.openNextFile();
  43.  
  44.     if (! entry) {
  45.  
  46.       // no more files
  47.       break;
  48.     }
  49.  
  50.     String folderName = entry.name();
  51.     if (!folderName.equals("/System Volume Information"))
  52.     {
  53.       foldersList.add(folderName);
  54.     }
  55.     entry.close();
  56.   }
  57. }


Se volete realizzare i collegamenti necessari per utilizzare l'esempio sopra, qui trovate tutte le info.

Questo è tutto,
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

Nessun commento:

Posta un commento

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post