variabili

sto cercando di imparare, chiedo venia, anche considerata la mia età : 60 anni :slight_smile:

la parte che ora mi interessa è quella iniziale riferita alle variabili.
Se ho capito bene, le variabili possono essere nominate come più ci piace (ovviamente con lo stesso riferimento nello sketch)
Ad esempio int timeDelay(40); potrei nominarla ritardoTempo, quindi: int ritardoTempo(40);
L'istruzione int dir = 1; dove dir è una variabile o un comando?

Nella lista dei comandi di Arduino non ho trovato dir, quindi penso sia una variabile, come tale posso chiamarla in altro modo?

p.s. sto leggendo molti libri su Arduino, ma alterno con piccole prove pratiche

Per semplificare, se vedi delle parentesi tonde, è una istruzione/comando.

int x=funzione(10);
int y=x;

Nella prima hai una inizializzazione di x assegnandogli un valore restituito da una funzione (caso complesso).
Nel secondo caso tutte variabili.

Però int timeDelay(40); non ha senso, dove l'hai letta ?
può avere senso int x=timeDelay(40);
oppure int timeDelay=40;

ciao nid69ita

la variabile l’avevi già vista… qui http://forum.arduino.cc/index.php?topic=329838.0

quindi int dir=1; non si può cambiare ad esempio in int ciao=1; ?

Certo che gli puoi cambiare nome ad una variabile, devi però poi farlo in tutto il programma.

Per quella istruzione, non ci avevo fatto caso prima, ma è errata, non ha senso. Il compilatore dovrebbe darti errore. Stai guardando il codice errato di un utente che ha solo quel post e pare nessuna esperienza di programmazione.
Li bisogna scrivere:
int timeDelay=40;
Le tonde non hanno nessun senso.

Volendo partire dalle "basi", direi di cercare qualche libro scolastico, livello istituto tecnico, che parli del c e c++ e della programmazione in genere.

phil5611:
sto cercando di imparare, chiedo venia, anche considerata la mia età : 60 anni :slight_smile:

Tranquillo sei un buona compagnia, non siamo pochi ad essere over 50 e anche over 60 :slight_smile:
Alle variabili puoi il nome che preferisci a patto che non sia identico a quelli dei comandi C/C++, p.e. una variabile si può chiamare "fori" ma non "for" perché "for" è un comando C/C++ e come tale viene interpretato dal compilatore.
Quando dichiari le variabili assicurati sempre di usare il giusto tipo dato, oltre ad essere inutile è anche dannoso, spreca ram, usare un int, peggio un long int, per un valore che è minore di 255 se è senza segno, oppure compreso tra 127 e -128 se dotato di segno, in questi casi si usa "char" per i valori con segno e byte (= unsigned char) per quelli senza segno.
Se si tratta di un valore che non cambierà mai all'interno del programma, p.e. un pin di Arduino, non si deve usare una variabile ma una #define oppure una "const" perché non occupano spazio in memoria, in fase di compilazione il compilatore sostituisce il nome simbolico con il valore assegnato senza creare una variabile.

Esempi:

#define LED 13
const byte LED = 13;

Tutte e due assegnano il valore 13 al nome LED senza usare memoria.

nid69ita:
Li bisogna scrivere:
int timeDelay=40;
Le tonde non hanno nessun senso.

Un senso ce l'hanno: in C++ anche i tipi primitivi hanno una sorta di "finto costruttore", che permette essenzialmente di usare, per inizializzare un tipo primitivo, una sintassi simile a quella che si usa con gli oggetti. Il motivo di questo credo sia più che altro la ricerca di una vaga "uniformità sintattica". In sostanza, le seguenti cose sono equivalenti:

int x = 42;
int x (42);

Detto questo, non ho mai visto la seconda sintassi usata da nessuna parte :D.

nid69ita:
Certo che gli puoi cambiare nome ad una variabile, devi però poi farlo in tutto il programma.

Per quella istruzione, non ci avevo fatto caso prima, ma è errata, non ha senso. Il compilatore dovrebbe darti errore. Stai guardando il codice errato di un utente che ha solo quel post e pare nessuna esperienza di programmazione.
Li bisogna scrivere:
int timeDelay=40;
Le tonde non hanno nessun senso.

che sia corretto come dici tu, ci credo, ma ti assicuro che l’istruzione funziona nello sketch provato e riprovato (e ho aggiunto anche il potenziometro con successo)

speedyant:
Volendo partire dalle "basi", direi di cercare qualche libro scolastico, livello istituto tecnico, che parli del c e c++ e della programmazione in genere.

ciao... ne ho... al momento sto studiando (nel modo che un sessantenne può fare) "arduino programmazione wiring"
comunque ho anche un libro di C++
ma come ripeto non si può studiare senza un minimo di pratica, quindi eseguo sketch facili sia da compilare che da riprodurre elettronicamente (con breadboard e Arduino).
Man mano che un dubbio mi assale, rompo qui :slight_smile:

astrobeed:
...
Quando dichiari le variabili assicurati sempre di usare il giusto tipo dato, oltre ad essere inutile è anche dannoso, spreca ram, usare un int, peggio un long int, per un valore che è minore di 255 se è senza segno, oppure compreso tra 127 e -128 se dotato di segno, in questi casi si usa "char" per i valori con segno e byte (= unsigned char) per quelli senza segno.
Se si tratta di un valore che non cambierà mai all'interno del programma, p.e. un pin di Arduino, non si deve usare una variabile ma una #define oppure una "const" perché non occupano spazio in memoria, in fase di compilazione il compilatore sostituisce il nome simbolico con il valore assegnato senza creare una variabile.
...

Meno male (per i 60 enni)
sul fatto di non usare comandi in variabili e che comunque queste siano ripetute correttamente: tutto ok!
devo applicarmi maggiormente sulla parte che ho quotato...
Mi è ancora difficile ricordare tutti i tipi di variabili (so che ce ne sono 10) ma sopratutto quale preferire in un determinato contesto

phil5611:
che sia corretto come dici tu, ci credo, ma ti assicuro che l'istruzione funziona nello sketch provato e riprovato (e ho aggiunto anche il potenziometro con successo)

Attenzione, il fatto che compila senza errori (ma secondo me dei warning ci sono ma sono "nascosti" dall'IDE) non vuol dire che funziona. In alcuni casi il compilatore compila, segnala warning e pratica una "specie" di correzione.
Ad esempio avrai letto che il confronto uguale si fa usando il doppio = mentre l'assegnazione un uguale solo.
if( miaVar==0) // test corretto
Bene, questo viene "accettato" e compilato SENZA errori:
if( miaVar=0)
Qui in realtà si assegna a miaVar il valore zero, e poi viene fatto un test

Come scrive @Sukko in Arduino compila il gcc quindi linguaggio C++
Probabilmente la sintassi è corretta per il C++, tra parentesi passi il valore ad un costruttore.
Ma se lo fai in C ti da errore (crea un file prova.c nella cartella dello sketch e metti dentro solo quella riga, da errore)
Mi viene difficile da dire se in quel codice l'utente HA VOLUTO usare la sintassi "C++" per inizializzare invece di una semplice assegnazione con = Ma visto che le altre inizializzazioni le fa usando = e NON le tonde mi vien da dire che ... è stato fortuito e gli è andata di c.. fortuna :slight_smile:

nid69ita: sono andato a rivedere il libro "Creare progetti con Arduino for Dummies" e in effetti è come dici tu " int timeDelay=40; " e nel mio sketch è corretto... mi ero stampato poi gli sketches, da me fatti e provati, con Copia&Incolla in un file word ... si vede che ha fatto una correzione ????
scusa per il tempo perso, dovevo controllare subito!

tra l'altro sul libro un errore c'è alla fine dice di aggiungere un potenziometro e spiega come farlo (5v ad un piedino, A0 al piedino centrale, e gnd al terzo)
poi dice di aggiungere due righe in fondo

delayTime=analogic(0);
delay(5)

solo che la variabile nel resto del programma si chiama timeDelay, quindi mi Arduino mi restituiva un errore ...

@phil ti confermo che il compilatore gcc (quello che usa "di sotto" Arduino IDE) accetta la sintassi
int timeDelay(40); perchè è una sintassi accettata dal C++
I file .ino di Arduino sono compilati come se fossero C++ se il file avesse estensione .c non compilerebbe.

Per il tempo perso... figurati, nessun problema. Anzi ne ho scoperta un'altra assieme a voi. Non mi veniva in mente che Arduino potesse accettare quel tipo di dichiarazione+inizializzazione alla C++ ;D

nid69ita:
@phil ti confermo che il compilatore gcc (quello che usa "di sotto" Arduino IDE) accetta la sintassi
int timeDelay(40); perchè è una sintassi accettata dal C++
I file .ino di Arduino sono compilati come se fossero C++ se il file avesse estensione .c non compilerebbe.

Per il tempo perso... figurati, nessun problema. Anzi ne ho scoperta un'altra assieme a voi. Non mi veniva in mente che Arduino potesse accettare quel tipo di dichiarazione+inizializzazione alla C++ ;D

nid69ita: sono andato a rivedere il libro "Creare progetti con Arduino for Dummies" e in effetti è come dici tu " int timeDelay=40; " e nel mio sketch è corretto... mi ero stampato poi gli sketches, da me fatti e provati, con Copia&Incolla in un file word ... si vede che ha fatto una correzione ????

@nid69ita storicamente il compilatore C per il sistema operativo Unix si chiamava CC, Stallman quando ha riscritto Unix sotto il nome di GNU (Gnu is Not Unix) ha anteposto il proprio marchio "g" ad ogni applicazione che girava su tale sistema.
Indi per cui CC è diventato il celeberrimo GCC ovvero "Gnu C Compiler", come dice il nome quel compilatore costruisce programmi solo per il linguaggio C.
Date le potenzialità di tale compilatore sono state introdotte numerevoli varianti ed è nato il compilatore "g++" colui che è incaricato di compilare i sorgenti scritti in C Plus Plus.
Arduino dunque compila i file ".ino" e ".cpp" con il compilatore g++ mentre i file ".c" con gcc.

Infine come ha detto giustamente @sukkopera l'inizializzazione proposta dall'utente è valida per il linguaggio C++ ma non per il C.
Io come purista del C eviterei tali simili obrobri, ma Arduino è C++ quindi non mi espongo e ritorno ad intrecciare i peli del gatto.