Il successo di un tipo di dati: il casting delle variabili in C

di Carlo A. Mazzone

Il nome dell’articolo potrebbe suggerire un qualcosa collegato al mondo dello spettacolo: niente di più lontano dalla verità. Il casting, nel contesto informatico, non ha assolutamente a che fare con la selezione di un certo sviluppatore come attore in un qualche film ma piuttosto con l’attribuzione del tipo di dati più adatto ad una data variabile per una determinata circostanza implementativa.

Inizio con una semplice constatazione: talvolta il risultato di certe operazioni tra tipi di dati può dare risultati del tutto inaspettati. Ma andiamo con ordine ponendoci questa domanda: cosa accade quando assegno ad una variabile il valore di un’altra variabile appartenente ad un tipo di dati diverso?

Mi spiego meglio; quando scrivo qualcosa del tipo:

x=y;

se x ed y sono dello stesso tipo, semplicemente il valore di y viene copiato in x. Tuttavia, se x è ad esempio di tipo intero ed y di tipo float inevitabilmente la parte frazionaria di y verrà persa nell’assegnazione del valore ad x, al limite con un avvertimento (warning) da parte del compilatore.

Ad esempio, il seguente codice:

int main(int argc, char *argv[])

{

int x;

float y=5.5;

x=y;

printf(“Il valore di x e’: %d\n”, x );

printf(“Il valore di y e’: %.2f\n”, y );

return 0;

}

produrrà come output:

Il valore di x e’: 5

Il valore di y e’: 5.50

In generale, infatti, le uniche conversioni che non generano problemi sono quelle che consentono di ampliare la dimensione di una variabile. Ad esempio, nessun problema, ovviamente, nel caso contrario quello appena visto in cui assegniamo un intero ad una variabile float ottenendo come risultato che la variabile float avrà come parte intera il valore intero del numero assegnato e come parte frazionaria il valore zero.

Il valore di x e’: 6

Il valore di y e’: 6.00

Questi tipi di conversione vengono detti conversioni implicite in quanto realizzate automaticamente dal compilatore. In altri casi, però, è necessario “forzare” un tipo di variabile ad essere diversa da quella che risulterebbe in maniera naturale: si parla allora di conversione esplicita. Tali conversioni vengono definite in modo gergale cast oppure casting, ed usando a volte espressioni come “castare una variabile”.

Vi propongo allora una situazione tipica:

int main(int argc, char *argv[])

{

int x=7, y=2;

float d;

d=x/2;

printf(“Il valore di d e’: %.2f\n”, d );

return 0;

}

poiché d è stata dichiarata come float ci si aspetterebbe come risultato il valore 3,5. Sbagliato! L’operazione di divisione tra due interi viene appunto intesa come un fatto “privato” tra interi che da come risultato un valore intero, nel nostro caso il valore 3, che solo successivamente viene assegnato alla variabile con la virgola d. Tale problema è comunissimo e si verifica ad esempio nel caso in cui si deve calcolare la media di un dato numero di elementi interi per il quali, nonostante si prevede una variabile di tipo float si otterrà comunque un numero intero. Per risolvere la situazione si usa allora il casting di cui vi dicevo con la seguente sintassi:

(tipo_dati) espressione

Ad esempio, nel nostro caso sarà sufficiente scrivere:

d=(float)x/2;

per ottenere in stampa il valore desiderato ed atteso di 3,5.

Supportaci condividendo sui social il nostro articolo!

SVN ed il controllo degli accessi 2: la vendetta

E’ possibile rendere più fine il controllo degli accessi sui repository di SVN che utilizzano Apache 2 rispetto alle impostazioni standard che prevedono che un utente possa semplicemente accedere in lettura e scrittura ad uno specifico repository nella sua globalità.

Ad esempio, potrebbe essere possibile, in caso di necessità, voler consentire ad un dato utente l’accesso in lettura ad un repository e l’accesso in lettura e scrittura su di un altro repository. Ancora, potrebbe essere richiesto, relativamente ad uno stesso repository di abilitare la lettura o la scrittura su specifiche sottodirectory.

Per ottenere questa maggiore granularità di controllo con SVN è possibile modificare la configurazione del file di Apache rimuovendo, se presente, la riga: 

AuthGroupFile /etc/apache2/groups

che gestisce i gruppi “classici” ed aggiungere la direttiva:          

Require valid-user

che richiederà la validazione per tutti gli utenti che tenteranno di accedere al repository. Ovviamente /etc/apache2/groups è un file  specifico di un esempio specifico e potrebbe avere un nome differente in base a scelte personali.    

A questo punto è possibile aggiungere una riga come la seguente:

AuthzSVNAccessFile /etc/apache2/svnaccessfile

che indica il file sul quale verranno impostati i permessi di accesso.

In definitiva avremo qualcosa del tipo:

<Location /miorepo>
DAV svn
SVNListParentPath on
SVNPath /percorso/miorepo
AuthType Basic
AuthName “SVN repository”
AuthUserFile /etc/apache2/users
Require valid-user
AuthzSVNAccessFile /etc/apache2/svnaccessfile
</Location>


Il file in questione, /etc/apache2/svnaccessfile,  è un file di testo come il seguente:

[groups]
readers = michele
devs = carlo, marco, luigi, simone, daniele

[miorepo:/]
@readers = r
@devs = rw

#abilitazione-disabilitazione selettiva sottodirectory
[miorepo:/trunk/ProgettoX/cartellaY/cartellaZ]
carlo = rw

La direttiva [groups]  indica, così come ci aspetteremmo, i gruppi di utenti. Tali utenti sono ovviamente quelli inseriti con la normale procedura nel file  /etc/apache2/users

Le successive direttive, banalmente individuabili grazie al fatto di essere identificate da parentesi quadre specificano qualcosa del tipo:

[repository:percorso]

dove “repository” è ovviamente il nome del repository che si intende gestire e percorso è la cartella del repository stesso. Ad esempio:

[miorepo:/]

indica nella sua totalità il repository  “miorepo”.
I permessi specifici andranno inseriti nelle righe di seguito come ad esempio:

[miorepo:/]
@readers = r
@devs = rw

Si intuisce che ogni riga di abilitazione è formata da due sezioni separate dal simbolo “=”. Nel caso specifico ho inserito i nomi dei gruppi definiti nella sezione apposita. Si intuisce anche che per indicare i gruppi si antepone al nome del gruppo il simbolo della chiocciolina.
I simboli “r” e “rw” stanno ovviamente, rispettivamente, per sola lettura e lettura scrittura. Oltre ai nomi dei gruppi è possibile indicare i nomi dei singoli utenti, così come il carattere jolly * ad indicare tutti gli utenti.

Come detto è possibile settare i permessi di lettura/scrittura anche su di una specifica sottodirectory come segue:

[miorepo:/trunk/ProgettoX/cartellaY/cartellaZ]
carlo = rw

dove /trunk/ProgettoX/cartellaY/cartellaZ è il percorso nel repository che si vuole gestire in maniera differente rispetto alle restanti sezioni.

Per chiudere segnalo il seguente link di sicuro interesse:
http://svnbook.red-bean.com/en/1.1/ch06s04.html

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!