Pages: [1] 2   Go Down
Author Topic: Coda di bit  (Read 1152 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti,

sto lavorando ad un progetto che consiste nel creare una lista di operazioni da eseguire sequenzialmente. Più nello specifico una lista in cui vado a mettere il numero del relay da attivare (ne ho 4) e il tempo durante il quale deve restare attivo (espresso in ore: 2, 4 o 8 ) garantendo la precedenza sempre all'operazione che richiede maggior tempo. Mi è stato consigliato di farlo con i bit:

2 per rappresentare i relay (00, 01, 10, 11)
e 4 per rappresentare il tempo in ore (0010, 0100, 1000)

Per quanto riguarda la priorità avevo pensato ad una maschera di bit. Il problema è che non so quale struttura dati utilizzare. Un arrayqueue può andare bene? E come tipo di dato "byte" aggiungendo due zeri?
« Last Edit: August 21, 2013, 08:51:29 am by leo72 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il byte è un tipo di dati che contiene 8 bit, per cui a te va bene.
Puoi manipolare i singoli bit in modo molto semplice:
bitSet imposta ad 1 un singolo bit
http://arduino.cc/en/Reference/BitSet

bitRead legge lo stato di un singolo bit
http://arduino.cc/en/Reference/BitRead

bitClear pulisce un bit
http://arduino.cc/en/Reference/BitClear

Inoltre se usi le operazioni logiche sui bit
http://arduino.cc/en/Reference/BitwiseAnd

puoi anche leggere gruppi di bit in un unico blocco. Puoi anche manipolare direttamente i pin di una porta logica, trasportando sui pin lo stato dei bit in un unico passaggio:
http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille per la risposta, mi è stata di grande aiuto. Ora però è sorto un altro impiccio...
Quando un elemento deve essere inserito in coda, controllo i tre bit che corrispondono alle modalità e li confronto con quelli degli elementi già presenti in coda. Se entrambi hanno la stessa modalità allora giustamente quello che vado ad aggiungere si accoda dietro a quello già presente (sempre se non ce ne sia un altro già accodato con ancora la stessa modalità). Ora il mio dubbio è: usando un Arrayqueue, come posso aggiungere quell'elemento nella posizione in cui deve andare e spostare tutti gli altri di una posizione in avanti?
La mia idea era di fare:

Code:
for (i=i+1, coda.size(), i++){
coda[i+1]= coda[i];
}
elemento= coda[i];

Esiste un modo migliore per farlo?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi spostare materialmente le varie celle.
Tieni presente però di non inserire le celle oltre la dimensione massima dell'array. Tu leggi la dimensione di coda ma se coda ha già tutte le sue celle occupate, il nuovo valore lo inserisci all'esterno di coda, e la cosa può creare problemi perché quel byte va a inserirsi in RAM in una posizione casuale, anche sopra ad un altro valore.
Logged


0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usa un array circolare.

In pratica tu dai per scontato che l'indice INIZIALE dell'array sia sempre 0.. ma se invece l'indice iniziale è una variabile? allora ti basta incrementare di uno questa variabile per aggirare il problema.

poi quando vuoi la terza cella fai:

Code:
array[(indiceSfaso+3)%lunghezzaArray]
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma esiste una struttura dati per inserire un elemento in mezzo all'array e non in cima o in fondo? Sinceramente finora non ho trovato sketch con la struttura dati QueueArray (http://playground.arduino.cc/Code/QueueArray) o ArrayList che usano questa funzione...
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Strutture dati native non esistono. Se devi inserire un byte in una cella di un array devi fare posto nell'array.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Capisco, ma operativamente parlando, per spostare materialmente le celle il mio ragionamento è errato?
Quote
Code:
for (i=i+1, coda.size(), i++){
coda[i+1]= coda[i];
}
elemento= coda[i];
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Piuttosto che usare .size io userei un indice che mi punta all'ultimo byte usato. Così eviteresti di spostare non solo le celle vuote ma anche di sforare oltre la fine dell'array
Logged


0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

è corretto ma è inefficiente. però usare una lista di strutture su arduino è uno spreci di ram enorme
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

error: no match for 'operator[]' in 'coda'

Qual è la sintassi per indicare un elemento della coda?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Metti il codice che stai usando.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì scusate, è che sto provando prima su uno sketch grezzo... Ecco il codice brutale:
Code:
#include <QueueArray.h>

QueueArray <byte> coda;

void setup() {
  byte elemento = 60;
  coda.push(elemento);
   elemento = 45;
  coda.push(elemento);
   elemento = 90;
  coda.push(elemento);
  Serial.begin(9600); // inizializzazione della comunicazione serial monitor a 9600 baud
  coda.setPrinter(Serial);
  Serial.print("coda: ");
  int i;
  for (i=0; i<=3; i++){
    Serial.print(i);
    Serial.print(": ");
    Serial.println(coda[i];
  }
  posizionaElemento(87);
  for (i=0; i<=4; i++){
    Serial.print(i);
    Serial.print(": ");
    Serial.println(coda[i]);
  }
}

void loop() {
 
  // put your main code here, to run repeatedly:
 
}

void posizionaElemento(int daPosizionare) {
  boolean posizionato = false;
  while (posizionato==false){  // finchè non posiziono
    for (i=0; i<=coda.length(); i++){ // scorre gli elementi della coda fino alla sua ampiezza
              if (daPosizionare > coda{i}){ // presa con priorità
              for (i; i<=coda.length(); i++){
                coda[i++] = coda[i];
              }
              elemento=coda[i];
              posizionato=true;
              }
    }
  }
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma se usi quella funzione non credo tu possa accedere a "coda" come ad un normale array.
Devi usare i metodi messi a disposizione dalla lib.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo nella documentazione non c'è nessun metodo per accedere ad un elemento (http://playground.arduino.cc/Code/QueueArray). Perciò chiedevo un'altra struttura dati che ce l'avesse. Se devo fare tutto a mano, almeno devo sapere qual è quella giusta che mi consenta di fare questa cosa. Qualche cosa seguita da documentazione, magari con qualche esempio perché non sono molto esperto in programmazione e per me è un grosso scoglio questo problema...
Logged

Pages: [1] 2   Go Up
Jump to: