* * * *
16 Visitatori, 0 Utenti

16 Ott 2011 - Costanti e variabili

Si può considerare una variabile come un contenitore dove andare ad immagazzinare un informazione. Questa informazione può variare nel tempo, proprio per questo si chiama variabile. Si può considerare una costante al pari di una variabile ma una volta riempita con un valore quello rimane fisso fino alla fine del programma. Quando si dichiara una variabile si occupa dello spazio in memoria per tutta la durata del programma o della funzione o della procedura, dipende dove questa variabile è dichiarata. Si può anche dire allocare in memoria una variabile. Affronteremo questo capitolo in maniera pratica come sarà di consuetudine in questa community. Per capire l'argomento di discussione di questo capitolo apriamo una nuova console application come abbiamo fatto precedentemente per il primo programma.

Dove troviamo scritto { add your program here } andiamo ad aggiungere le seguenti righe:


Codice: delphi [Seleziona]
clrscr();

writeln('La costante da me dichiarata con il nome MiaCostante ha un valore di:', MiaCostante);

PrimaVariabile := 'A';
SecondaVariabile := 3;
TerzaVariabile := 3.3;
QuartaVariabile := TerzaVariabile + 1;
QuintaVariabile := 'Ecco a cosa servono le variabili!';
 
writeln('PrimaVariabile: ', PrimaVariabile);
writeln('SecondaVariabile: ', SecondaVariabile);
writeln('TerzaVariabile: ', TerzaVariabile);
writeln('QuartaVariabile: ', QuartaVariabile);
writeln('QuintaVariabile: ', QuintaVariabile);
writeln('La costante da me dichiarata con il nome MiaCostante ha un valore di:', MiaCostante);

PrimaVariabile := 'B';
SecondaVariabile := SecondaVariabile + 2;
TerzaVariabile := 3.3 + 1;
QuartaVariabile := TerzaVariabile + 1;
QuintaVariabile := 'Ecco a cosa servono le variabili! Fine';

writeln('PrimaVariabile: ', PrimaVariabile);
writeln('SecondaVariabile: ', SecondaVariabile);
writeln('TerzaVariabile: ', TerzaVariabile);
writeln('QuartaVariabile: ', QuartaVariabile);
writeln('QuintaVariabile: ', QuintaVariabile);

repeat until keypressed;



e sopra dove troviamo scritto:

Codice: delphi [Seleziona]
var 
  ErrorMsg: String;

 

lo modifichiamo in modo che risulti così:


Codice: [Seleziona]
var
  ErrorMsg: String;
  PrimaVariabile: char;
  SecondaVariabile: integer;
  TerzaVariabile, QuartaVariabile: real;
  QuintaVariabile: string;

const
  MiaCostante = 5;


Ora analizziamo quello che abbiamo appena fatto. Prendiamo in esame l'ultima modifica effettuata, var è una parola riservata che sta a significare che voglio dichiarare delle variabili o delle costanti. Dichiarare vuol dire che si decide che tipo di contenuto può possedere la variabile in questione, se numerica intera, numerica decimale, alfanumerica, stringa, o altro.

Consideriamo solo le variabili che abbiamo aggiunto noi, la prima si chiama PrimaVariabile ed è definita come char, ovvero può contenere caratteri. La seconda si chiama SecondaVariabile ed è definita integer, ovvero un tipo numerico intero come il 5 o 8 ma non ad esempio 4,5 o 4.3. La TerzaVariabile e la QuartaVariabile sono di tipo real ovvero numerico con la virgola. Mentre la QuintaVariabile è di tipo string ovvero può contenere una lettera come una parola o una frase alfanumerica. E poi per ultima la costante MiaCostante, che avrà il valore 5 per tutta la vita del programma. Ora vediamo in pratica come si differenzia una variabile da una costante. Come si può notare nella prima parte di codice che abbiamo modificato in questo programma abbiamo assegnato dei valori alle variabili e poi le abbiamo stampate a video, e poi nuovamente rivalorizzate e successivamente ristampate. Se il lettore si prendesse la briga di provare a riassegnare un valore alla costante noterebbe che in fase di compilazione del programma si otterrebbe un errore, perchè una costante non può essere rivalorizzata dopo essere stata dichiarata. Compilando attraverso il solito pulsantino che contiene un triangolino verde saremo in grado di vedere il risultato del nostro articolo.

I tipi principali delle variabili disponibili nel linguaggio free pascal sono: integer, shortint, smallint, longint, longword, int64, byte, word, cardinal, qword, boolean, bytebool, longbool, char.

Per quanto riguarda i tipi numerici li possiamo così classificare:


TipoRangeDimensione in bytes
Byte0..2551
Shortint-128..1271
Smallint-32768..327672
Word0..655352
Integero Smallint o Longint2 o 4
CardinalLongword4
Longint-2147483648 .. 21474836474
Longword0..42949672954
Int64-9223372036854775808 .. 9223372036854775807 8
QWord0 .. 184467440737095516158



Per quanto riguarda il tipo integer che può variare da smallint a longint è il freepascal a fare la conversione automatica del tipo in base al contenuto stesso della varibile.

Oltre ai tipi interi esistono anche i tipi booleani ovvero variabili che contengono i valori TRUE e FALSE (VERO o FALSO).

NomeDimensione in bytesValore TRUE/VERO
Boolean11
ByteBool1Qualsiasi valore diverso da zero
WordBool2Qualsiasi valore diverso da zero
LongBool4Qualsiasi valore diverso da zero


Free pascal e quindi anche lazarus visto che si basa su questo linguaggio comprende anche il tipo Char che è esattamente un byte di dimensione e contiene uno dei caratteri ASCII. Una costante di tipo carattere quando verrà dichiarata avrà il valore tra virgolette ad esempio 'A'. Un carattere può anche essere specificato dal suo codice ASCII facendolo precedere dal carattere #. Ad esempio #65 equivale ad 'A'.

Oltre il tipo Char esiste anche il tipo String che che è definito come in Turbo Pascal ovvero una sequenza di caratteri, con una specifica dimensione facoltativa. Essa sostiene inoltre anche AnsiString con lunghezza illimitata come in Delphi.

Il tipo string va da 1 carattere a 255 e viene dichiarato nel seguente modo:

Codice: [Seleziona]
NomeVariabile: string[50];


In questa maniera abbiamo dichiarato una variabile di nome NomeVariabile che può contenere 50 caratteri, ovvero una stringa di 50 caratteri. Mentre le variabili dichiarate come AnsiString sono quelle che terminano con null e vengono gestiti tramite puntatori dal linguaggio, ma del tutto trasparenti al'utente programmatore. Facciamo un esempio se dichiaro la variabile

Codice: [Seleziona]
NomeVariabile: AnsiString; 


ottengo una variabile potenzialmente infinita (può essere grande tanto quanto la memoria messa a disposizione dalla macchina su cui gira il programma). Facciamo un confronto, se dichiaro una stringa non ansi come ho fatto precedentemente allora se andando avanti nell'esecuzione del programma necessito di memorizzare nella variabile una stringa di 51 caratteri non posso farlo e il programma va in errore in fase di compilazione (o meglio segnala che c'è un errore ma il programma viene realizzato ma tronca la stringa a 10 caratteri), nel secondo caso no.

Facciamo un esempio pratico creando una nuova console application e modificandola in modo che sia così:

Codice: delphi [Seleziona]
program project1;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
{$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, Crt
  { you can add units after this };

type
  {TMyApplication }
  TMyApplication = class(TCustomApplication)
  protected
  procedure DoRun; override;
  public
  constructor Create(TheOwner: TComponent); override;
  destructor Destroy; override;
  procedure WriteHelp; virtual;
  end;

{TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
  PrimaVariabile: string[10];
  SecondaVariabile: AnsiString;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h','help');
  if ErrorMsg'' then
  begin
    ShowException(Exception.Create(ErrorMsg));
    Halt;
  end;
 
  // parse parameters
  if HasOption('h','help') then
  begin
    WriteHelp;
    Halt;
  end;

  { add your program here }
  clrscr();
  PrimaVariabile:='sono 10 lettere mie';
  SecondaVariabile:='sono 10 lettere';
  writeln(PrimaVariabile);
  writeln(SecondaVariabile);
  repeat until keypressed;
  // stop program loop
  Terminate;
end;

constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

destructor TMyApplication.Destroy;
begin
  inherited Destroy;
end;

procedure TMyApplication.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ',ExeName,' -h');
end;


var
  Application: TMyApplication;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}


begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.




Se compilate oltre a vedere il risultato vedrete che viene riportato un errore in fase di compilazione dovuta al fatto che la stringa contenuta in PrimaVariabile contiene più caratteri di quelli consentiti.

Free pascal supporta anche l'implementazione delphi Pchar che è definito come un puntatore ad un tipo Char. Può essere paragonato ad una stringa che termina con il null, vale a dire che il Pchar è un puntatore ad un array di tipo char che termina con il
carattere null. Free pascal permette l'inizializzazione delle variabile di tipo Pchar sotto forma di costanti o tramite inizializzazine dirette. Ad esempio dichiariamo in una nuova console application la seguente variabile nella parte dichiarativa del programma:


Codice: [Seleziona]
var
  PrimaVariabile: Pchar;


poi nella parte esecutiva del codice dove troviamo il commento { add your program here } digitiamo


Codice: [Seleziona]
PrimaVariabile:='Questa stringa termina con il null';
writeln(PrimaVariabile);
repeat
until keypressed;


salviamo ed eseguiamo il codice e avremo come risultato la scritta: Questa stringa termina con il null.

Ora apriamo una nuova console application e nella parte dichiarativa scriviamo:

Codice: [Seleziona]
const
  SecondaVariabile: Pchar =  'Questa stringa termina con il null';


e nella parte esecutiva scriviamo:

Codice: [Seleziona]
writeln(PrimaVariabile);
repeat
until keypressed;


se salviamo ed eseguiamo il programma allora noteremo che avremo lo stesso risultato del programma precedente.

N.B. Le variabili possono essere suddivise in due macrocategorie: variabili globali e variabili locali. Le variabili globali sono dichiarate nella sezione dichiarativa del programma principale. Hanno visibilità e "vita" per tutta la durata del programma e in tutte le procedure. Le variabili locali sono dichiarate nella sezione dichiarativa di una procedura/funzione.
Hanno visibilità e "vita" solo all'interno della procedura in cui sono state dichiarate.

N.B. Tutti i real vengono visualizzati in notazione scientifica, che non sempre è bella da vedere o utile ai fini della visualizzazione. Per ovviare a questo problema basta specificare quante cifre avrà la parte decimale. La sintassi per fare questo è:

NomeVariabile:NumeroCifreTotali:NumeroCifreDecimali.

In questo caso  writeln('Esempio real: 'MiaVariabile:6:2) avremo come risultato un valore di 6 cifre di cui 2 sono decimali, ovviamente la MiaVariabile doveva essere dichiarata real.

Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon

Articles in « PROGRAMMATORE ALZATI E CAMMINA CON LAZARUS »

Comments *

Commenting option has been turned off for this article.

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
Utenti
  • Utenti in totale: 520
  • Latest: vinpug
Stats
  • Post in totale: 10287
  • Topic in totale: 1303
  • Online Today: 24
  • Online Ever: 74
  • (Luglio 09, 2012, 11:05:53 am)
Utenti Online
Users: 0
Guests: 16
Total: 16

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.