[DOC] TYPE's

[DOC] TYPE's

Postby CicTec » Tue Jul 16, 2013 4:03 pm

I TYPE's permettono la creazione di nuovi tipi di dati complessi (user-def), simili alle strutture, offrendo tuttavia un maggiore flessibilità, permettendo la dichiarazione di dati di questo tipo (variabili, array, puntatori...).

1 - DICHIARAZIONE DI TYPE'S
I TYPE si dichiarano nella sezione TYPEDEF e hanno la seguente forma:
TYPE name
fields_list;
END

field_list - Rappresenta una lista di dichiarazioni di dati (variabili, array, puntatori) di tipo base o user-def.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • typedef
  •   type vector2D
  •     float x;
  •     float y;
  •   end
  •  

La dichiarazione precedente crea un nuovo tipo di dato (TYPE) di nome "vector2D", contenente 2 campi, "x" e "y" di tipo FLOAT.

NOTA:
- Per essere valido, un TYPE deve contenere almeno un campo (field).
- Un TYPE può contenere campi di qualunque tipo, base o user-def.
- Un TYPE può contenere un campo dello stesso tipo, solo se questo è un puntatore.
- Un TYPE non può avere lo stesso nome di un TYPE dichiarato precedentemente.




2 - DICHIARAZIONE DI DATI TYPE'S
Una volta dichiarato i TYPE, è possibile dichiarare dati (GLOBAL, LOCAL, PRIVATE) dello stesso tipo.
La dichiarazione è uguale alla dichiarazione di dati base ed ha la seguente forma:
type {*/pointer} name{[N]}
type - Rappresenta il tipo di dato (TYPE) da dichiarare (es: vector2D).
*/pointer - Rappresenta la dichiarazione di puntatore (es: *vec).
name - Rappresenta il nome del nuovo dato (es: vec).
[N] - Rappresenta la dichiarazione di array (es: vec[10]).


Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   vector2D vec_var;
  •   vector2D vec_array[9];
  •   vector2D *vec_ptr;
  •  

La dichiarazione precedente crea i seguenti dati globali:
- Una variabile di nome "vec_ver" di tipo "vector2D"
- Un array di nome "vec_array" di 10 elementi di tipo "vector2D"
- Un puntatore di nome "vec_ptr" di tipo "vector2D"


3 - INIZIALIZZAZIONE
E' possibile inizializzare TYPE's e dati in vari modi.


3.1 - INIZIALIZZAZIONE DI DATI TYPE
E' possibile inizializzare esplicitamente dati di tipo (TYPE) durante la dichiarazione, nella seguente forma:
type {*/pointer} name{[N]} = values_list
values_list - Rappresenta una lista di uno o più valori (nel caso di array), con il quale il dato verrà inizializzato.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   vector2D vec_var = 10, 10;
  •   vector2D vec_array[9] = 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9;
  •   vector2D *vec_ptr = 0;
  •  

La dichiarazione precedente inizializza i seguenti dati globali:
- La variabile "vec_ver" con i valori 10,10 per i campi "x" e "y".
- L'array "vec_array" con i valori da 0,0 a 9,0 per i campi "x" e "y" di ogni elemento.
- Il puntatore "vec_ptr" con il valore 0.

NOTA:
- Se non si inizializza esplicitamente un dato, questo conterrà per default i valori dei campi di TYPE del quale è dichiarato (vedere il 3.2 in basso per una spiegazione più dettagliata).
- Se si utilizzano più inizializzatori del numero totale di campi, si avrà un error di compilazione.
- Un puntatore può essere inizializzato unicamente con il valore 0 (o NULL), altrimenti si avrà un error di compilazione.



3.2 - INIZIALIZZAZIONE DI TYPE'S
Per default, tutti i campi di un TYPE sono inizializzati a 0 in automatico, questo significa che tutti i campi di qualunque dato di tipo dichiarato, avranno il valore 0.
A volte può essere utile (o necessario) che i TYPE contengano altri valori per i propri campi.
E' possibile dichiarare TYPE inizializzati, usando la seguente forma:
type name
fields_list = values_list;
end

field_list - Rappresenta una lista di dichiarazioni di dati (variabili, array, puntatori) di tipo base o user-def.
values_list - Rappresenta una lista di uno o più valori (nel caso di array), con il quale il dato verrà inizializzato.


Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • typedef
  •   type RGBAcolor
  •     int r = 255;
  •     int g = 255;
  •     int b = 255;
  •     int a = 255;
  •   end
  •  

La dichiarazione precedente crea un nuovo tipo di dato (TYPE) di nome "RGBAcolor", contenente 4 campi, "r", "g", "b" e "a" di tipo INT, inizializzati ogniuno con il valore 255.

NOTA:
- Non è necessario inizializzare tutti i campi, i campi senza necessaria inizializzazione esplicita, verrano inizializzati automaticamente a 0.
- I campi puntatori possono essere inizializzati solo a 0 (0 NULL), altrimenti si avrà un errore di compilazione.



I TYPE's inizializzati, permettono di dichiarare dati dello stesso tipo senza la necessità di inizializzare esplicitamente i campi del dato.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   RGBAcolor color_white_var;
  •   RGBAcolor color_white_array[9];
  •  

La dichiarazione precedente inizializza i seguenti dati globali:
- La variabile "color_white_var" con i valori 255, 255, 255, 255 per i campi "r", "g", "b" e "a".
- L'array "color_white_array" con i valori 255, 255, 255, 255 per i campi "r", "g", "b" e "a" di ogni elemento.


3.3 - INIZIALIZZAZIONE MISTA DI DATI
E' possibile missare inizializzazione automatica (data da TYPE's inizializzati) e inizializzazione esplicita.
L'inizializzazione missata è utile quando si vogliono inizializzare dati parzialmente lasciando alcuni valori di default.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   RGBAcolor color_red_var = , 0, 0;
  •   RGBAcolor color_green_var = 0, , 0;
  •   RGBAcolor color_blue_var = 0, 0;
  •  

La dichiarazione precedente inizializza i seguenti dati globali:
- La variabile "color_red_var" con i valori 0 e 0 per i campi "g" e "b", lasciando i campi "r" e "a" con i propri valori di default (dati dai valori del TYPE).
- La variabile "color_green_var" con i valori 0 e 0 per i campi "r" e "b", lasciando i campi "g" e "a" con i propri valori di default (dati dai valori del TYPE).
- La variabile "color_blue_var" con i valori 0 e 0 per i campi "r" e "g", lasciando i campi "b" e "a" con i propri valori di default (dati dai valori del TYPE).

NOTA
- Per poter lasciare un valore inizializzato di default, è sufficiente lasciare lo spazio dello stesso "vuoto" cioè senza porre alcun valore e separandolo con una virgola se questo si trova tra altri valori.



4 - ACCESSO AI CAMPO DEI DATI TYPE'S
Una volta dichiarato dati di tipo user-def (TYPE) è possibile accedere ai campi dello stesso nella seguente forma:
data_name.field_name;
data_name - Rappresenta il nome del dato di tipo dichiarato (es: vec_var).
field_name - Rappresenta il nome del campo del dato di tipo dichiarato (es: x).

L'operatore di accesso punto (.), permette di accedere ai campi del tipo e poter effettuare operazioni con essi.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   RGBAcolor color;
  •  
  • begin
  •   color.r = 64;
  •   color.g = 128;
  •   color.b = 255;
  •   color.a = 255;
  • end
  •  

L'esempio precedente accede per mezzo dell'operatore "." ai campi del dato "color" di tipo "RGBAcolor", assegnando un valore ad ogni campo.


5 - PASSAGGIO DI PARAMETRI E TIPO DI RITORNO
E' possibile passare parametri ad un blocco (PROCESS, FUNCTION, METHOD o funzione di sistema) nelle 2 forme supportate per i tipi base:
- Per valore, copiando i valori dell'argomento al parametro che riceve il suddetto argomento.
- Per referenzia, passando l'indirizzo dell'argomento al parametro.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • function vector2D vector_add(vector2D v1, vector2D v2)
  • private
  •   vector2D v_result;
  •  
  • begin
  •   v_result.x = v1.x + v2.x;
  •   v_result.y = v1.y + v2.y;
  •  
  •   return(v_result);
  • end
  •  
  • ...
  •  
  • vres = vector_add(vec1, vec2);
  •  

Nell'esempio precedente viene definita una funzione di nome "vector_add" di 2 parametri di tipo "vector2D" e un tipo di ritorno di tipo "vector2D".
La chiamata della stessa, nella linea:
vres = vector_add(v1, v2);
Produce il passaggio per valore dei dati vec1 e vec2 ai parametri v1 e v2 di tipo "vector2D" della funzione, e quest'ultima una volta eseguita l'operazione, restituisce una copia del risultato, salvandolo nella variabile "vres" di tipo "vector2D".

NOTA:
- I tipi (TYPE) di dati devono essere gli stessi, altrimenti si avrà un errore di compilazione tentando di eseguire operazioni con essi.
- Il passaggio per valore o il tipo di ritorno di dati di tipo (TYPE) non puntatori è costosa, quindi si raccomanda di utilizzare dati TYPE di piccole dimensioni.
- Non è possibile dichiarare parametri array o restituire array.



6 - COPIA DI DATI TYPE'S
Se i dati sono dello stesso tipo (TYPE) è possibile fare copie dirette mediante l'operatore "=", come si farebbe con i dati di tipo base.

Esempio:
Source Code (Gemix) [ Download ] [ Hide ]
  • global
  •   vector2D vec1_v, vec2_v;
  •   vector3D vec3_v;
  •   vector2D vec1_a[10], vec2_a[10];
  •  
  • begin
  •   vec1_v = vec2_v; // OK copio i valori di vec2 in vec1
  •   vec3_v = vec2_v; // ERROR, i tipi non coincidono
  •   vec1_a = vec2_a; // OK copio l'array vec2_a in vec1_a
  •   vec2_v = vec1_a[3]; // OK, copio l'elemento 3 dell'array vec1_a in vec2
  • end
  •  

L'esempio precedente inizializza i seguenti dati globali:
- La variabile "vec1_v" con i valori della variabile "vec2_v".
- La variabile "vec3_v" con i valori della variabile "vec2_v", in questo caso si produce un errore di compilazione, visto che i tipi (TYPE) non coincidono (le variabili non sono dello stesso tipo).
- L'array "vec1_a" con i valori dell'array "vec2_a".
- La variabile "vec2_v" con i valori dell'elemento 3 dell'array "vec1_a".

NOTA:
- Se i TYPE sono diversi (anche se contengono lo stesso tipo e numero di campi) non sarà possibile effettuare la copia di dati, altrimenti si avrà un errore di compilazione.
- Se si tenta di copiare un array più grande dell'array di destinazione, verranno copiati solo i valori che coincidono con la grandezza totale dello stesso.
- Si deve fare particolare attenzione quando si copiano dati contenenti campi puntatori, dato che il valore copiato sarà lo stesso indirizzo al quale il puntatore punta (se diverso da NULL) e qualunque utilizzo successivo alla copia dopo la liberazione della memoria puntata dal puntatore, può produrre un errore o crash del programma.
User avatar
CicTec
 
Posts: 15201
Joined: Thu Jul 31, 2008 10:18 pm

Return to Documentazione

Who is online

Users browsing this forum: No registered users and 1 guest