Extern: richiamare funzioni esterne a Gambas

Da Gambas-it.org - Wikipedia.

Gambas offre la possibilità di utilizzare potenzialità, capacità di sistemi esterni mediante il richiamo di loro funzioni. A volte infatti può capitare nella programmazione la necessità di utilizzare potenzialità che Gambas da solo non può offrire{1}. L'istruzione che Gambas pone a disposizione del programmatore per richiamare tali funzioni esterne è: Extern.

Per il richiamo di funzioni esterne è necessario conoscere in particolare tre elementi:

  • il quid, ossia il cosa fare, cosa ottenere;
  • la funzione esterna che ci consente di realizzare quel quid;
  • la libreria nella quale è contenuta la funzione da richiamare.

Se quel che che si vuole ottenere è possibile solamente attraverso l'uso di una funzione esterna a Gambas, bisognerà individuare la specifica funzione che consente di realizzare il nostro obiettivo. La funzione esterna, utile allo scopo del programma, dovrà essere richiamata dal nostro programma Gambas. Poiché tale funzione esterna è scritta in C, bisognerà interpretare il significato e tradurla in forma comprensibile da Gambas. Inoltre, poiché essa è appunto esterna a Gambas, bisognerà conoscere il luogo ove essa si trova. Il luogo che contiene la funzione esterna è la "Libreria"; ed anzi una specifica libreria, la quale, pertanto, andrà dichiarata in anticipo rispetto alla funzione. Le librerie, contenenti funzioni esterne a Gambas, richiamabili da Gambas, sono quelle con estensione .so . E' opportuno, quando possibile, indicare anche il numero della versione della Libreria.

Possiamo, dunque, dire che è un po' come se Extern annunciasse: « Farò in modo che il programma utilizzi questa funzione "xxxx(yyy)", la quale non appartiene alle risorse di Gambas, ma si trova in questa libreria: zzzz.so (oppure già precedentemente dichiarata). ».

La Libreria, contenente la funzione esterna da richiamare, può essere dichiarata separatamente, e prima della dichiarazione Extern:

Library "libreria_esterna:num_vers"

Extern......

La Libreria può anche essere dichiarata all'interno dell'istruzione di Extern:

Extern ................. IN "libreria_esterna:num_vers"


La funzione vera e propria, da richiamare per il suo utilizzo, sarà posta all'interno di una routine. Dunque, nel caso di dichiarazione separata della Libreria, la scaletta delle dichiarazioni sarà la seguente:
1) dichiarazione della Libreria contenente la funzione;
2) dichiarazione mediante Extern della funzione esterna che si andrà ad utilizzare (questa dichiarazione avverrà al di fuori della routine che farà uso di quella funzione);
3) chiamata ed uso della funzione.

Esempio:

' Gambas class file

' dichiariamo la Libreria contenente la funzione esterna che ci interessa:
Library "libreria_esterna:num_vers"


' dichiariamo la funzione esterna specifica che ci interessa.
 ' Ipotizziamo che in C sia così scritta: int funzione_esterna_da_richiamare(char * valoreStringa, int valoreInteger).
 ' Alla funzione esterna vanno passati due valori: uno è una Stringa, l'altro è un Integer. Essa restituirà un valore Integer.
 ' In Gambas la richiameremo così:
Private EXTERN funzione_esterna_da_richiamare(valoreA As String, ValoreB As Integer) As Integer

Public Sub routine_esempio(primoValore As String, secondoValore As Integer)   ' poniamo il caso che vengano passati i due valori alla routine necessari per la funzione esterna.

Dim vlr1 As String
Dim vlr2 As Integer
Dim rit_funz As Integer

' chiamiamo la funzione esterna che ci interessa,
 ' e le passiamo i due valori ricevuti dalla routine, perché li elabori.
 ' Coerentemente con la dichiarazione con Extern i due valori (vlr1, vlr2) saranno una Stringa ed un Integer:
  rit_funz = funzione_esterna_da_richiamare(vlr1, vlr2)

  Print rit_funz

End


Uso di due o più funzioni esterne contenute ciascuna in una diversa Libreria

Può accadere la necessità di utilizzare funzioni che sono contenute in due o più Librerie. In tal caso bisogna ricordare che la dichiarazione di una Libreria influenzerà ogni dichiarazione con Extern successiva. Cosicché, in questo caso, bisognerà dichiarare la Libreria corrispondente prima di Extern e della routine contenente la funzione da utilizzare:

Library "1^_libreria_esterna:num_vers"

Private EXTERN funzione_esterna(valoreA As ..., ValoreB As ...) As ...

Public Sub prima_routine_esempio(Aval As ..., Bval As ....)
  ...... ' qui l'uso della 1^ funzione esterna
End


Library "2^_libreria_esterna:num_vers"

Private EXTERN funzione_esterna(valoreC As ..., ValoreD As ...) As ...

Public Sub seconda_routine_esempio(Cval As ..., Dval As ...)
  ...... ' qui l'uso della 2^ funzione esterna
End

Qualora nell'esempio precedente fosse necessario richiamare, per utilizzare, una funzione esterna presente nella 1^ Libreria, si dovrà dichiarare nuovamente la 1^ Libreria.



Note

[1] Prendiamo come esempio il rapporto fra Gambas ed il sistema sonoro ALSA. Se non si avesse la possibilità di richiamare, e quindi di utilizzare le funzioni proprie di ALSA, non sarebbe possibile interloquire con questo sistema esterno. Non sarebbe possibile gestirne le capacità, e dunque utilizzare le sue funzioni e potenzialità. L'istruzione Extern ci consente di superare questo muro, questo limite.