apportando minime modifiche, lo sketch non funziona

ho creato una versione un po rozza di quei keypad lcd che si trovano sulla baia.

vorrei usare il tastierino per comandare un menu su un display lcd, ma non vi preoccupate, sto andando per passetti.

al momento sto leggendo il valore dal tastierino e, quando il pulsante viene rilasciato, lo metto in una variabile.

questa variabile fa scattare if diversi a seconda del valore che possiede, nello specifico se la lettura è 4 allora accende un led e riporta a 0 quella dell if, mentre se è 3 spegne il led e porta a 0 quella dell if.

insomma, qualcosa come questo:

if(value == 4)
{
  digitalWrite(ledpin,HIGH);
  value = 0;
}

if( value == 3)
{
digitalWrite(ledpin,LOW);
value = 0; 
}

lo sketch da cui e tratto funziona.

il problema sorge quando al posto del led, provo ad incrementare o decrementare una variabile, usando A = A++ o --.

in questo caso non funziona.

la variabile la uso int, al momento è utile che raggiunga anche numeri negativi.

se non ricordo male con l'ide 1.5.9 mi pare, aumentando o decrementando la variabile funzionava

(poi nella versione 1.6.5 hanno messo l'autosalvataggio in fase di upload di default e ho perso il codice funzionante :sob: )

cio da cosa puo dipendere?

button.ino (519 Bytes)

keypad_0.6.ino (566 Bytes)

lcd.ino (235 Bytes)

... non mi sembra che l'incremento (o il decremento) siano A=A++; ... ma solo A++; ... ma non so se e' quello che non ti va ...

era proprio quello....

mi sto prendendo un poco male :grin:

be dai, almeno funziona

grazie mille della risposta, non credo ci sarei arrivato da solo :grinning:

potevi anche scrivere :

A=A+1; oppure A=++A;

sarebbe stato la stessa cosa

@icio:
oppure A=++A;

questo non si fa!!!!!!!!!!!!!!

++A;

questo si!

Ma non dovrebbe essere

A ++;

++A;
A++;
Fanno la medesima cosa:
A = A + 1;
ma logicamente parlando è da preferirsi la prima.

Per farsi male, c'e' anche A+=1;
quindi 4 modalità:
A=A+1;
A+=1;
A++;
+AA;

@nid volendo incrementare di due:
A = 1+++A;
Al male non c'è mai fine....

vbextreme:
@nid volendo incrementare di due:
A = 1+++A;
Al male non c'è mai fine....

O anche ++A+=1;
Mai provato !! sfido a leggere righe del genere :grin:

... ma a voi le emicranie che normalmente causano i linguaggi di programmazione gia di loro, non vi bastano ? ... dovete proprio andarvi a cercare anche le martellate extra sulle @@ ? ... :stuck_out_tongue: :smiley:

Tafazzi docet.

Fanno anche delle gare apposite su chi riesce a scrivere un programma in C nel modo più incomprensibile possibile :slight_smile:

tipo quello che ho postato qua?(messaggio 19)
Avevo poco tempo, altrimenti facevo di meglio :stuck_out_tongue:
Invece che giocare alla psx.....

vbextreme:
questo non si fa!!!!!!!!!!!!!!
A=++A;

Dovrebbe funzionare perchè PRIMA fà l'incremento e poi lo assegna ad A

mentre A=A++; non funziona perche prima lo assegna ad A e POI fà l'incremento

non ho detto che non va, ma che non si fa.
Il tutto per mantenere un codice leggibile, elegante

icio:
.....
mentre A=A++; non funziona perche prima lo assegna ad A e POI fà l'incremento

In realtà funziona anche A=A++;

@icio, dimmi quali di questi tre codici capisci:

int main()
{
    char *str = "abccdeddef";
    char *s = str;
    char *c;
    unsigned int count[26][26];
    int i,j,r;
    
    memset(count,*s^*s,sizeof(int)*26*26);

    for(;
    *s;
    ++s)
    for(c=s+1,r=1<<1;
    !!*c&!!r--;
    ++*(*(count+(*s&~0x60)-1)+(*c&~0x60)-1),
    ++*(*(count+(*c++&~0x60)-1)+(*s&~0x60)-1));
    
    puts(str);
    
    for(i^=i;i<26;)
        printf("  %c",(i++|0x60)+1);
    puts("");
    
    for (i^=i;i<26;++i)
    {
        for(printf("%c ",(i|0x60)+1),
        j^=j;
        j<26;
        printf("%d  ",*(*(count+i)+j++)));
        puts("");
    }
    
    return 0;
}
int main()
{
    char s[] = "abccdeddef";
    unsigned int ls = (sizeof s) - 1;
    unsigned int count[26][26];
    unsigned int range = 2;
    int i,j,r;
    
    memset(count, 0, sizeof(int) * 26 * 26);

    for ( i = 0; i < ls; ++i)
    {
        for( j = i + 1, r = range; s[j] && r; ++j, --r )
        {
            ++count[s[i] - 'a'][s[j] - 'a'];
            ++count[s[j] - 'a'][s[i] - 'a'];
        }
    }
    
    puts(s);
    
    for (i = 'a'; i <= 'z'; ++i)
        printf("  %c", i);
    puts("");
    
    for ( i = 'a'; i <= 'z'; ++i)
    {
        printf("%c ", i);
        for ( j = 'a'; j <= 'z'; ++j)
            printf("%d  ",count[i - 'a'][j - 'a']);
        puts("");
    }
    
    return 0;
}
int main()
{
    char* str = "abccdeddef";
    char* s = str;
    char* c;
    unsigned int count[28][28];
    unsigned int range = 2;
    int i,j;
    
    memset(count, 0, sizeof(int) * 28 * 28);
    
    for (; *s; ++s)
    {
        for( c = s + 1, i = range; *c && i; ++c, --i )
        {
           ++count[*s - 'a'][*c - 'a'];
           ++count[*c - 'a'][*s - 'a'];
        }
    }
    
    puts(str);
    for (i = 'a'; i <= 'z'; ++i)
        printf("  %c", i);
    puts("");
    
    for ( i = 'a'; i <= 'z'; ++i)
    {
      printf("%c ", i);
      for ( j = 'a'; j <= 'z'; ++j)
         printf("%d  ",count[i - 'a'][j - 'a']);
      puts("");
    }
    
    return 0;
}

Sono tutti corretti dal punto di vista sintattico ma il primo si comprende bene mentre il secondo e soprattutto il terzo è un rompicapo, ma ad occhio fanno tutti e 3 la stessa cosa, sì ho capito ...la pulizia del codice... non posso che essere d'accordo, comunque di tanto in tanto capita di dover mettere mani al lavoro di altri quindi un pò di elasticità (e bestemmie) necessita