Vai al contenuto

ūüď£ sulla piattaforma e-learning di Codice Inutile sono disponibili i miei corsi: Introduzione alla programmazione e ūüÜē Introduzione all'Arte Generativa

Variabili in Processing: creazione e personalizzazione

ūüď¨ Per rimanere aggiornato sui prossimi articoli e su altri contenuti di creative coding, puoi iscriverti a questa newsletter. Per farlo √® sufficiente inserire il tuo indirizzo e-mail nel campo qui sotto.

Puoi leggere l'archivio qui. Powered by TinyLetter

Abbiamo già incontrato il termine variabile un paio di settimane fa quando avevo descritto, ad esempio, come utilizzare mouseX e mouseY per rendere i nostri sketch interattivi.

Come avevo scritto in quel post:

[le variabili sono] dei parametri che possono assumere un valore che può essere cambiato durante l’esecuzione del programma attraverso, ad esempio, semplici funzioni matematiche.

Oggi impareremo a creare delle variabili personalizzate e capiremo come utilizzarle nei nostri programmi. Quella di oggi è una lezione di fondamentale importanza perché, come avrete modo di vedere, cambierà completamente il vostro modo di programmare.

Creare delle variabili

Creare una variabile è un processo relativamente semplice. I passaggi che dobbiamo fare sono i seguenti:

  1. Dichiarazione della variabile
    • Assegnazione di un data type
    • Assegnazione di un nome alla variabile
  2. Inizializzazione della variabile
  3. Utilizzo della variabile

In poche parole dobbiamo dare un nome alla variabile, dirgli che tipologia di informazione vogliamo che contenga e dobbiamo assegnargli un valore iniziale. Se questi passaggi sono fatti nel modo corretto (e, tra poco, vi spiegherò come fare), poi potremmo usare quelle variabili a nostro piacimento.

Partiamo da un esempio:

int lunghezza;
lunghezza = 110;

Cosa abbiamo fatto con queste due linee di codice? Abbiamo creato una variabile¬†di tipo¬†integer (abbreviato in¬†int) chiamata lunghezza¬†e l’abbiamo inizializzata assegnando un valore pari a 110.

A una variabile possiamo assegnare il nome che vogliamo senza particolari restrizioni a patto che tale nome non sia già utilizzato dalla sintassi di Processing. La regola empirica per capire se possiamo utilizzare un nome che abbiamo scelto è: se il nome che assegnamo non cambia colore, non dovremmo avere problemi.

Una¬†buona pratica da seguire √® quella di dare un nome alle variabili che sia significativo e rifletta l’utilizzo che verr√† fatto successivamente: questo render√† il nostro codice facilmente interpretabile anche a mesi o anni di distanza.¬†Quindi, bench√© io possa nominare delle variabili tizio,¬†caio, e¬†sempronio se quella variabile verr√† utilizzata per definire la X di un ellisse √® meglio chiamarla, ad esempio,¬†circleX.

Dal momento che il nome¬†che assegniamo alle¬†variabili deve essere un’unica parola, i programmatori utilizzano il¬†cosiddetto CamelCase¬†per nominare variabili complesse. Nella pratica, si tratta di unire parole diverse tra loro lasciando le iniziali maiuscole (la prima lettera della variabile sempre minuscola). Ecco perch√©, vedendo dei programmi in Processing, troverete variabili come:¬†backgroundColor¬†oppure¬†radiusValue, ecc…

Ultima nota sui nomi delle variabili:¬†potendo scegliere¬†liberamente le parole da utilizzare non c’√® restrizione sulla lingua da utilizzare. Se volete rendere il vostro codice leggibile il pi√Ļ possibile, conviene ovviamente¬†usare l’inglese.

Tipi di dati

Assegnare il tipo di dato corretto è importante per evitare che il nostro programma smetta di funzionare e ci restituisca un errore. Se, infatti, il programma si aspetta di trovare un numero intero e riceve un numero decimale si bloccherà.

I principali tipi di dati sono:

  • integer: abbreviato in int e descrive un numero intero (es: 45)
  • float: descrive un numero decimale (es: 34,20394)
  • char: descrive un singolo carattere (es: ‘A’);
  • String: descrive una sequenza di caratteri (es: ‘Questa √® una stringa’)

Esistono anche altri tipi di dati e l’elenco completo pu√≤ essere trovato nel Reference. Per il momento √® sufficiente che impariate quelli descritti qui sopra.

Scopo delle variabili

Le variabili non devono essere per forza dichiarate e inizializzate tutte all’inizio del nostro programma. Possiamo farlo tranquillamente mentre procediamo con la scrittura del codice. Dobbiamo, per√≤, fare attenzione¬†allo scopo delle variabili ovvero in quale parte di codice¬†verr√† utilizzata.

Anche in questo caso, credo sia meglio partire da un esempio:

int circleX; // dichiarazione

void setup() {
  size(400, 400);
  circleX = 100; // inizializzazione
}

void draw() {
  ellipse(circleX, 110, 50, 50); // utilizzo
}

In questo breve programma ho creato una variabile circleX di tipo integer all’inizio del programma, nel blocco di codice setup() l’ho inizializzata assegnando un valore pari a 110 e l’ho utilizzata¬†in draw() per disegnare un cerchio. Se copiate e incollate il codice nell’editor di Processing e provate a farlo funzionare, non avrete alcun problema.

Ora cambiamo leggermente il nostro codice:

int circleX; // dichiarazione

void setup() {
  size(400, 400);
  circleX = 100; // inizializzazione
  int circleY = 110; // dichiarazione e inizializzazione
}

void draw() {
  ellipse(circleX, circleY, 50, 50); // utilizzo
}

In questo secondo esempio ho fatto una piccola modifica: ho creato e inizializzato una variabile chiamata circleY all’interno della funzione¬†setup()¬†e l’ho utilizzata all’interno della funzione¬†draw(). Se proviamo a far partire questo programma, otterremo un errore Cannot find anything named “circleY”:

Scopo delle variabili in Processing

Perch√© Processing non riesce a trovare la variabile circleY pur essendo stata dichiarata e inizializzata?¬†La differenza tra circleX e circleY √® che la prima √® una variabile¬†pubblica mentre la seconda √®¬†privata. Cosa significa? Nel primo caso, essendo stata dichiarata all’inizio, circleX¬†pu√≤ essere usata ovunque all’interno del programma; circleY, invece,¬†√® stata dichiarata all’interno della funzione¬†setup() ma viene utilizzata dalla funzione¬†draw() e questo non √® possibile. √ą come se ogni blocco di codice fosse un’entit√† privata a s√© stante e le variabili che vengono dichiarate al suo interno non possono essere utilizzate dagli altri blocchi di codice.

Per far¬†funzionare questo secondo esempio abbiamo due possibilit√†: spostare la dichiarazione di circleY¬†all’inizio del programma ‚Äď l’inizializzazione pu√≤, invece, rimanere all’interno di setup() o¬†all’interno di draw() ‚Äď oppure possiamo spostare la funzione ellipse() dentro il blocco di codice setup().

Nel prossimo post vedremo insieme come modificare una (o pi√Ļ) variabili, controllarne in ogni momento il valore¬†e, attraverso esempi pratici,¬†utilizzarle.

Articolo precedente

Eventi: mousePressed() e keyPressed()

Articolo successivo

Variabili in Processing II: operazioni matematiche

Unisciti alla discussione

  1. Ma posso chiederti la tua mail così ti scrivo in provato? Io ho sempre molti dubbi che magari per molti sono molto banali

    1. Preferisco che le richieste e i commenti siano pubblici e a disposizione di tutti per almeno un paio di motivi:
      1. ricevo tantissime e-mail ogni giorno e c’√® il rischio che le richieste di aiuto vengano sommerse da tutto il resto e, di conseguenza, non ricevano pi√Ļ risposta.
      2. per quanto riguarda nello specifico la programmazione, gran parte delle cose che ho realizzato e dei dubbi che ho avuto durante il mio personale percorso di apprendimento e studio sono stati dissipati da una ricerca su internet o, nel caso di processing, da una community molto vasta di persone pronte e disposte ad aiutarmi con le loro risposte. Molte volte ho trovato risposta ai miei dubbi nelle richieste fatte da altre persone in precedenza.

      Anche se i tuoi dubbi possono sembrare banali, potrebbero essere d’aiuto a qualcun altro e, per questo, √® importante che tutto sia pubblico (e, ad esempio, √® il motivo per cui ogni tanto pubblico articoli nella rubrica “Coding Rescue”) :)

  2. Ciao Federico, come posso copiare un file da una directory ad un’altra senza caricarlo in Processing. Vorrei soltanto fargli fare una semplice copia di un file. Grazie anticipatamente

    1. √ą necessario importare la libreria di java denominata nio: import java.nio.*; che, al suo interno, ha la funzione copy (pi√Ļ info nella documentazione di Oracle).

      L’esempio di utilizzo √® questo:

      Path source = ...
      Path newdir = ...
      Files.copy(source, newdir.resolve(source.getFileName());

      Devi dare la cartella di origine, quella di destinazione e poi invocare la funzione .copy();

      Al di l√† del codice qui sopra riportato: sicuro che convenga fare una cosa del genere con Processing se devi semplicemente copiare i file da una cartella a un’altra?

  3. ho trovato la soluzione, potrebbe servire ad altri :
    Path oldFile = Paths.get(“c:/Users/Angelo/Desktop/Interfaccia_CRESO_2/” + “output.dat”);
    Path newFile = Paths.get(“c:/Users/Angelo/Desktop/DiscoZeta/”+”Dava_patch.dat”);
    File old_dava_patch = new File(savePath(path_appoggio),”Dava_patch.dat”);
    if (old_dava_patch.exists()) {old_dava_patch.delete();}
    try{Files.copy(oldFile, newFile);println(“Ho spostato il file dove mi hai chiesto”); } catch (IOException e) {println(“Non sono riuscito a copiarlo”);}
    try{Files.delete(oldFile);println(“Ho cancellato il vecchio file “); } catch (IOException e) {println(“Non sono riuscito a cancellarlo”);}

    1. Se il file è accessibile tramite url non dovrebbe essere un problema caricarlo come fosse un qualsiasi file (in generale le funzioni di apertura accettano sia directory che url)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.