Go Down

Topic: Aiuto per capire qual'è il mio errore (Read 484 times) previous topic - next topic

SteZ

Ciao a tutti ho creato questo programmino (è ancora in attesa di migliorie)
Code: [Select]

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8);
char password[5] = {95,95,95,95};
char Pcorretta[5] = {"1992"};
char tasti[5][5] = {
                    {"1", "2", "3", "A"},
                    {"4", "5", "6", "B"},
                    {"7", "8", "9", "C"},
                    {"*", "0", "#", "D"}
                   };
char tastoPremuto1;
char tastoPremuto2;
int latchPin = 12;
int clockPin = 13;
int dataPin = 11;
long oldTime;
int lockCr;
boolean Blink = HIGH;
boolean risposta = 0;
byte chiave1 [8] = {14,17,17,17,17,17,14};
byte chiave2 [8] = {0,0,0,31,2,2,0};

void setup()

{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(16, INPUT);
  pinMode(17, INPUT);
  lcd.createChar(1, chiave1);
  lcd.createChar(2, chiave2);
  lcd.begin(7, 2);
  lcd.noCursor();
  Serial.begin(9600);
  //
  oldTime = 650;
  lcd.home();
  lcd.print("PASSWORD");
  Blink = 1;
}

void loop()
{
  while(1)
  {
    for(int cr=0; cr<4; cr++)
    {
      if ((Blink == LOW) && (password[cr] == 95)){
        password[cr] = 32;
      }
      if ((Blink == HIGH) && (password[cr] == 32)){
        password[cr] = 95;
      }
      lcd.setCursor((cr+4), 1);
      lcd.write(password[cr]);
    }
    if (oldTime < millis())
    {
      Blink = !Blink;
      oldTime = (millis() + 650); 
    }
    if (lockCr == 4){
      break;
    }
    leggoKeyboar();
  }
 
 
  delay(1000);
  lcd.clear();
  for(int i=0; i<48; i++)
  {
    if(password[i]!=Pcorretta[i])
    {
      risposta=1;
      break;
    }
    else
    {
      risposta=0;
    }
  }
  Serial.println(risposta);
  if(risposta == 0)
  {
    lcd.clear();
    lcd.home();
    lcd.print("UNLOCKED");
    lcd.setCursor(6, 1);
    lcd.write(1);
    lcd.setCursor(7, 1);
    lcd.write(2);
    delay(5000);
    while(1){
    }
  }else{
    lcd.clear();
    lcd.home();
    lcd.print("ERROR");
    for(int j=0; j<9; j++)
    {
      lcd.setCursor(6, 1);
      lcd.write(1);
      lcd.setCursor(7, 1);
      lcd.write(2);
      delay(400);
      lcd.setCursor(6, 1);
      lcd.write(120);
      lcd.setCursor(7, 1);
      lcd.write(120);
      delay(400);
    }
    oldTime = 650;    //reset
    lcd.clear();
    lcd.home();
    lcd.print("PASSWORD");
    Blink = 1;
    lockCr=0;
    for(int i=0; i<5; i++)
    {
      password[i] = 95;
    }
   
  }
}


void leggoKeyboar()
{
  for (int k=0, k<4, k++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, (B00000001 << k));
    digitalWrite(latchPin, HIGH);
    for (int l=0, l<4, l++)
    { 
      if (digitalRead(l+14) != 0)
      {
        tastoPremuto1 = tasti[l][k];
        break;
      }else{
        tastoPremuto1 = 0;
      }
    }
  }
  delay(30);
  for (int k=0, k<4, k++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, (B00000001 << k));
    digitalWrite(latchPin, HIGH);
    for (int l=0, l<4, l++)
    { 
      if (digitalRead(l+14) != 0)
      {
        tastoPremuto2 = tasti[l][k];
        break;
      }else{
        tastoPremuto2 = 0;
      }
    }
  }
  if(tastoPremuto1 == tastoPremuto2) && (tastoPremuto1 != 0)
  {
    while(tastoPremuto1 == tastoPremuto2)
    {
      for (int k=0, k<4, k++)
      {
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, (B00000001 << k));
        digitalWrite(latchPin, HIGH);
        for (int l=0, l<4, l++)
        { 
          if (digitalRead(l+14) != 0)
          {
            tastoPremuto2 = tasti[l][k];
            break;
          }else{
            tastoPremuto2 = 0;
          }
        }
      }
    }
    password[lockCr] = tastoPremuto1;
    lockCr++;
  }
}


l'ho controllato e ricontrollato ma non mi sembra ci siano errori eppure l'IDE mi da i seguenti errori

Code: [Select]
password_lcd:11: error: too many initializers for 'char [5]'
password_lcd:11: error: too many initializers for 'char [5]'
password_lcd:11: error: too many initializers for 'char [5]'
password_lcd:11: error: too many initializers for 'char [5]'
password_lcd.ino: In function 'void leggoKeyboar()':
password_lcd:134: error: expected initializer before '<' token
password_lcd:191: error: expected primary-expression at end of input
password_lcd:191: error: expected `;' at end of input
password_lcd:191: error: expected primary-expression at end of input
password_lcd:191: error: expected `)' at end of input
password_lcd:191: error: expected statement at end of input
password_lcd:191: error: expected `}' at end of input

mi riuscireste ad aiutare a capire di che si tratta perchè io non riesco a far coincidere gli errori riportati con ciò che c'è scritto nello Sketch

Code: [Select]

char tasti[4][4] = {
                    {'1', '2', '3', 'A'},
                    {'4', '5', '6', 'B'},
                    {'7', '8', '9', 'C'},
                    {'*', '0', '#', 'D'}
                   };


Così dovrebbe funzionare. Il numero degli elementi effettivo è 4, enumerabili partendo da 0. 'A' per il compilatore è uguale a 65 e gli altri caratteri sono codificati secondo lo standard ASCII.

Quando un array è inizializzato con {1,2,3,4, ecc} non è necessario specificare il numero di elementi perchè il compilatore dimesiona l'array contando il numero di elementi. Se l'array è grande 5 e inizializzi solo 4 elementi, il 5 potrebbe contenere spazzatura, oppure essere inizializzato a 0.

Le stringhe sono collezioni di caratteri contenuti in un array nel quale l'ultimo elemento viene riempito con il carattere di fine stringa '\0'. Nota che '\' apre la sequenza di escape e tutto ciò che segue viene interpretato in modo speciale, così '\t', '\n' sono rispettivamente una tabulazione e un fine riga.

La rappresentazione umana della stringa o di altro viene trattata sempre come numeri, anche il numero decimale è trattato come binario a fare questo è il compilatore. Il C/C++ è un linguaggio molto vicino alla macchina e molto meno all'uomo e si trova un gradino più alto dell'assembley il quale si trova un gradino più alto del linguaggio macchina composto da sequenze binarie.

Code: [Select]

void leggoKeyboar()
{
  for (int k=0, k<4, k++)


Al posto della virgola metti il punto e virgola.

Il compilatore protesta con messagi di errore criptici, che però sono molto dettagliati, c'è il nome del file, la funzione, il numero di riga, l'errore, ecc, il difficile è che non c'è un . a fine errore ma è una sequenza da interpretare.

Parere personale:
È frustrante perdersi per così poco, gli errori lessicali derivano da distrazione o mancato studio, ma anche da una predisposizione che porta l'osservatore ad osservare l'insieme è non il dettaglio, confondendo di conseguenza le virgole e altri caratteri considerati minori nella nostra lingua. Il compilatore è fiscale è non ha alternativa, fosse una macchina intelligente si rischierebbe di essere fraintesi come accade fra gli umani.

Codice troppo complicato per un principiante, devi costringerti a scrivere codice di tuo pugno che svolga anche funzionalità banali ma che coinvolga tutti i costrutti del linguaggio, if, if else, switch case, while, do while, ecc. Scrivendole di tuo pugno ti verra automatico aggiungere il ; a fine riga, non farai l'errore if (k=0) ma scriverai if (k==0) ecc.


Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

lesto

aggiungerei che per evitare casini con gli indici, un sistema veloce e sicuro è non metterli se si inizializza l'array alla creazione!
Code: [Select]
char tasti[][] = {
                    {'1', '2', '3', 'A'},
                    {'4', '5', '6', 'B'},
                    {'7', '8', '9', 'C'},
                    {'*', '0', '#', 'D'}
                   };
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy