Guide e Tutorials:indexed | |||||
Le API: ByVal, ByRef e passaggio di stringhe di testo Che cosa significa che Windows è un sistema operativo a 32 bit? Niente di più che tutti i valori passati come parametri alle sue funzioni interne (le API per intenderci) sono interi a 32 bit. Questa dichiarazione può apparire in effetti strana, soprattutto dopo che si è visto in dettaglio l'utilizzo ed il significato di ogni parte di una funzione, perchè dalla dichiarazione di una di esse risulta che le può essere passato come parametro sì un intero, ma anche un valore testuale, una struttura e così via. Se infatti consideriamo come funzione di esempio l'API joyGetPos:
notiamo che è richiesto come parametro sia un valore intero che una variabile che fa riferimento ad una struttura (la struttura JOYINFO). Andando oltre questo esempio esistono alcune funzioni che richiedono variabili stringa, array, byte e così via. Che cosa significa allora che anche in questi casi sono passati in realtà degli interi a 32 bit? Questo è il significato in poche parole del termine ByRef dove Ref abbrevia la parola Reference e non indica altro che un intero a 32 bit. In realtà quindi passare un qualsiasi valore ad una funzione di sistema non significa altro che passare il riferimento a tale valore. Così passare la struttura JOYINFO alla funzione joyGetPos non significa passarne tutti i membri bensì passarne un riferimento in forma di intero a 32 bit. Come si può comprendere, questo intero rappresenta un puntatore al dato da assegnare alla funzione. Che differenza intercorre tra un parametro passato ByVal ed uno passato ByVal? Come già spiegato nel dettaglio negli articoli di Giorgio Abraini, mentre le variabili passate ByRef possono essere modificate dalla funzione che quindi ne ha pieno accesso, per le variabili passate ByVal questo discorso non vale. E' un metodo di passaggio del Valore effettivo anziché dell'indirizzo che consente alla funzione di accedere a una copia della variabile. Le API utilizzano così il passaggio di parametri per valore solamente quando non necessitano di modificare la variabile in questione. E per le stringhe di testo? La discussione in questo caso si allunga ulteriormente poichè essendo le funzioni di Windows scritte in C++, le regole da seguire per utilizzarle seguono il principio generale di mantenere le direttive di tale linguaggio, anche in differenti ambienti di programmazione. Non troveremo quindi nel C++ un tipo di dato che corrisponde a String di Visual Basic ma una serie di valori che va da -128 a 127 rappresentati dal tipo di dati char che compongono il testo carattere per carattere. Perciò il tipo di dati definito String non è altro che uno speciale valore Long trattato in modo differente (ma soltanto apparentemente) per facilitarne l'impiego da parte degli utenti del linguaggio. L'immagine qui sotto rappresenta in maniera schematica la differenza tra ciò che accade in realtà e ciò che appare quando si passa una stringa di testo ad una funzione: Per chiarire ulteriormente il concetto si può considerare un esempio numerico. Se si prende in considerazione infatti una semplice struttura del tipo:
e si considera una variabile del tipo STRUTTURA che contiene il testo "Questo è solo un esempio":
ci si potrebbe aspettare che, visualizzando in una finestra di messaggio le dimensioni della struttura, venga riportata la lunghezza del suo contenuto ossia la lunghezza del testo "Questo è solo un esempio". Aggiungendo la funzione MsgBox alla routine Form_Load:
si scopre che in realtà il valore visualizzato è 4. Quattro infatti rappresenta la dimensione in byte di un intero numerico a 32 bit. |
Archivio:ndexed | ||||
Lezioni | Commenta questa lezione | Invia la tua guida | Avviso per le nuove lezioni | Proponi un argomento |
Visual Basic Italia© copyright 2000 - tutti i diritti riservati |