Differenze tra le versioni di "Gestire con sicurezza le Strutture esterne"

Da Gambas-it.org - Wikipedia.
Riga 7: Riga 7:
 
Una di queste funzioni deve ritornare la dimensione in byte della ''Struttura'', così da poterla allocarla con Gambas mediante la creazione di una variabile di tipo ''Puntatore''.
 
Una di queste funzioni deve ritornare la dimensione in byte della ''Struttura'', così da poterla allocarla con Gambas mediante la creazione di una variabile di tipo ''Puntatore''.
  
Le altre funzioni servono a leggere e scrivere dentro la ''Struttura''. Ad ogni funzione, atta a leggere o scrivere nella ''Strutture'', si passerà la relativa variabile di tipo ''Puntatore'', creata - come già detto - all'atto dell'allocazione, e l'eventuale valore da scrivere.
+
Le altre funzioni servono a leggere e scrivere dentro la ''Struttura''. Ad ogni funzione, atta a leggere o scrivere nella ''Struttura'', si passerà la relativa variabile di tipo ''Puntatore'', creata in Gambas - come già detto - all'atto dell'allocazione, e l'eventuale valore da scrivere (se si deve scrivere in un campo della ''Struttura'').
  
  
Dunque, avremo una funzione C per ciascuna ''Struttura'' da utilzzare che ti ritorna la dimensione della ''Struttura'' medesima:
+
Dunque, avremo una funzione C per ciascuna ''Struttura'' da utilizzare che ritorna la dimensione della ''Struttura'' medesima:
  int dimensione_Struttura(nome_della_Struttura *p) {
+
  int nome_funzione(nome_della_Struttura *p) {
 
     return sizeof(nome_della_Struttura);
 
     return sizeof(nome_della_Struttura);
 
   }
 
   }
Riga 18: Riga 18:
 
e una serie di funzioni per leggere e scrivere nei campi che interessano.
 
e una serie di funzioni per leggere e scrivere nei campi che interessano.
 
<BR>Per '''scrivere''' in un campo:
 
<BR>Per '''scrivere''' in un campo:
  void nome_funzione(nome_della_Struttura *p, int vl) {
+
  void nome_funzione(nome_della_Struttura *p, int valore_da_scrivere) {
 
     p->nome_campo = vl;
 
     p->nome_campo = vl;
 
   }
 
   }

Versione delle 15:16, 14 gen 2014

Talvolta nell'uso delle risorse appartenenti a librerie esterne ci si può imbattere in Strutture molto complesse, dichiarate nei relativi file header (.h), la trascrizione delle quali in Gambas "per qualsiasi ragione" può risultare assai difficile.

Per essere sicuri di non commettere errori, una parte di queste Strutture, e comunque quelle più ostiche, potrebbe non essere dichiarata, e usata così com'è in una libreria esterna condivisa (.so) appositamente realizzata.

Più in particolare per ogni struttura che si intende usare, all'interno di tale apposita libreria condivisa (.so) vengono scritte in C alcune funzioni che verranno richiamate dall'applicativo Gambas principale.

Una di queste funzioni deve ritornare la dimensione in byte della Struttura, così da poterla allocarla con Gambas mediante la creazione di una variabile di tipo Puntatore.

Le altre funzioni servono a leggere e scrivere dentro la Struttura. Ad ogni funzione, atta a leggere o scrivere nella Struttura, si passerà la relativa variabile di tipo Puntatore, creata in Gambas - come già detto - all'atto dell'allocazione, e l'eventuale valore da scrivere (se si deve scrivere in un campo della Struttura).


Dunque, avremo una funzione C per ciascuna Struttura da utilizzare che ritorna la dimensione della Struttura medesima:

int nome_funzione(nome_della_Struttura *p) {
   return sizeof(nome_della_Struttura);
 }


e una serie di funzioni per leggere e scrivere nei campi che interessano.
Per scrivere in un campo:

void nome_funzione(nome_della_Struttura *p, int valore_da_scrivere) {
   p->nome_campo = vl;
 }

e per leggere un campo, ad esempio per ritornare un valore Integer:

 int nome_funzione(nome_della_Struttura *p) {
   return p->nome_campo;
 }

oppure per ritornare una Stringa:

char * nome_funzione(nome_della_Struttura *p) {
   return p->nome_campo;
 }

oppure per ritornare un puntatore ad una Struttura secondaria contenuta in un'altra Struttura principale:

nome_Struttura_secondaria * nome_funzione(nome_della_Struttura_principale *p) {
   return &p->nome_campo_che_punta_alla_Struttura_secondaria;
 }