Differenze tra le versioni di "Uso della Classe System"

Da Gambas-it.org - Wikipedia.
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 6: Riga 6:
  
 
===Architecture===
 
===Architecture===
 
  
 
===Backtrace===
 
===Backtrace===
Riga 12: Riga 11:
  
 
===BreackOnError===
 
===BreackOnError===
 
  
 
===ByteOrder===
 
===ByteOrder===
La proprietà ''.ByteOrder'' ritorna un valore intero che rappresenta l'ordine dei byte del sistema.
+
La Proprietà ".ByteOrder" ritorna un valore intero che rappresenta l'ordine dei byte del sistema.
  
 
Tale ordine può essere:
 
Tale ordine può essere:
Riga 25: Riga 23:
  
 
===Charset===
 
===Charset===
 +
 
===Cores===
 
===Cores===
  
 
===Domain===
 
===Domain===
 
  
 
===Error===
 
===Error===
 
+
Restituisce il codice di errore Unix dell'ultimo errore generato da una chiamata di sistema, che corrisponde al Puntatore dereferenziato della funzione "[http://refspecs.linux-foundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/baselib---errno-location.html __errno_location()]".
  
 
===Family===
 
===Family===
 
  
 
===FirstDayOfWeek===
 
===FirstDayOfWeek===
La proprietà ''.FirstDayOfWeek'' ritorna la rappresentazione numerica del primo giorno della settimana, sulla base della corrente lingua e localizzazione.
+
La Proprietà ".FirstDayOfWeek" ritorna la rappresentazione numerica del primo giorno della settimana, sulla base della corrente lingua e localizzazione.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  System.FirstDayOfWeek As Integer
 
  System.FirstDayOfWeek As Integer
 
Per l'Italia il primo giorno della settimana è rappresentato con il numero " 1 " (quindi: lunedì = 1, domenica = 7).
 
Per l'Italia il primo giorno della settimana è rappresentato con il numero " 1 " (quindi: lunedì = 1, domenica = 7).
 
  
 
===FullVersion===
 
===FullVersion===
La costante ''.FullVersion'' ritorna una stringa che rappresenta la versione attuale completa dell'interpete di Gambas.
+
La Costante ".FullVersion" ritorna una stringa che rappresenta la versione attuale completa dell'interpete di Gambas.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  Const FullVersion As String = "3.6.0"
 
  Const FullVersion As String = "3.6.0"
 
  
 
===Host===
 
===Host===
La proprietà ''.Host'' ritorna una stringa che rappresenta l'<I>host name</i> del sistema operativo.
+
La Proprietà ".Host" ritorna una stringa che rappresenta l'<I>host name</i> del sistema operativo.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  System.Host As String
 
  System.Host As String
  
 +
===IgnoreOverflow===
  
 
===Language===
 
===Language===
La proprietà ''.Language'' ritorna o imposta una stringa che rappresenta la corrente lingua del sistema.
+
La Proprietà ".Language" ritorna o imposta una stringa che rappresenta la corrente lingua del sistema.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  System.Language As String
 
  System.Language As String
 
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Main()
+
  Publi' Sub Main()
 
   
 
   
 
  <FONT Color=gray>' ''Verifica la lingua impostata corrente del sistema:''</font>
 
  <FONT Color=gray>' ''Verifica la lingua impostata corrente del sistema:''</font>
Riga 74: Riga 69:
 
   System.Language = "fr_Fr"
 
   System.Language = "fr_Fr"
 
   
 
   
  '''End'''
+
  End
 
 
  
 
===Path===
 
===Path===
Riga 82: Riga 76:
 
La sua sintassi è:
 
La sua sintassi è:
 
  System.Path As String
 
  System.Path As String
 
  
 
===Profile===
 
===Profile===
 
  
 
===RightToLeft===
 
===RightToLeft===
 
  
 
===Shell===
 
===Shell===
La proprietà ''.Shell'' ritorna o imposta la "shell" che viene, o sarà, utilizzata quando si invierà il comando ''Shell''. Se non viene impostato, viene usato come predefinita la ''Shell'' con percorso "''/bin/sh''".
+
La Proprietà ".Shell" ritorna o imposta la "shell" che viene, o sarà, utilizzata quando si invierà il comando ''Shell''. Se non viene impostato, viene usato come predefinita la ''Shell'' con percorso "''/bin/sh''".
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  Shell As String
 
  Shell As String
 
 
 
Se, per esempio, viene creata un'applicazione 'a riga di comando' contenente il seguente codice:
 
Se, per esempio, viene creata un'applicazione 'a riga di comando' contenente il seguente codice:
  '''Private''' Sub Main()
+
  Private Sub Main()
 
   
 
   
  Exec [System.Shell]
+
  Exec [System.Shell]
 
   
 
   
  '''End'''
+
  End
 
e viene lanciata in un Terminale, sarà disponibile all'interno di quel medesimo Terminale una ''Shell'' con tutte le sue funzionalità.
 
e viene lanciata in un Terminale, sarà disponibile all'interno di quel medesimo Terminale una ''Shell'' con tutte le sue funzionalità.
  
Riga 111: Riga 100:
  
 
===TimeZone===
 
===TimeZone===
La proprietà ''.TimeZone'' ritorna un Intero che rappresenta il numero dei secondi da aggiungere al fuso orario locale per ottenere il fuso orario UTC.
+
La Proprietà ".TimeZone" ritorna un Intero che rappresenta il numero dei secondi da aggiungere al fuso orario locale per ottenere il fuso orario UTC.
 
<BR>La logica è invertita con il modo in cui il fuso orario viene solitamente stampato: se UTC+2, "Sytem.Timezone" restituirà -7200.
 
<BR>La logica è invertita con il modo in cui il fuso orario viene solitamente stampato: se UTC+2, "Sytem.Timezone" restituirà -7200.
  
Riga 118: Riga 107:
  
 
===Trace===
 
===Trace===
 
  
 
===User===
 
===User===
 
  
 
===Version===
 
===Version===
La costante ''.Version'' ritorna una stringa che rappresenta la versione attuale dell'interprete di Gambas.
+
La Costante ".Version" ritorna una stringa che rappresenta la versione attuale dell'interprete di Gambas.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  Const Version As String = "3"
 
  Const Version As String = "3"
 
  
  
Riga 135: Riga 121:
  
 
===Exist===
 
===Exist===
Il metodo ''.Exist()'' ritorna il valore Vero, se esiste all'interno della variabile d'ambiente ''PATH'' del sistema il programma specificato nel suo parametro.
+
Il Metodo ".Exist()" ritorna il valore Vero, se esiste all'interno della variabile d'ambiente ''PATH'' del sistema il programma specificato nel suo parametro.
  
 
La sua sintassi è:
 
La sua sintassi è:
Riga 142: Riga 128:
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Print System.Exist("gedit")
 
   Print System.Exist("gedit")
 
   
 
   
  '''End'''
+
  End
 
 
  
 
===Find===
 
===Find===
Il metodo ''.Find()'' cerca all'interno della variabile d'ambiente ''PATH'' del sistema il programma specificato nel suo parametro e, se trovato, ne ritorna il percorso completo.
+
Il Metodo ".Find()" cerca all'interno della variabile d'ambiente ''PATH'' del sistema il programma specificato nel suo parametro e, se trovato, ne ritorna il percorso completo.
  
 
La sua sintassi è:
 
La sua sintassi è:
Riga 156: Riga 141:
  
 
Esempio:
 
Esempio:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Print System.Find("gedit")
 
   Print System.Find("gedit")
 
   
 
   
  '''End'''
+
  End
 
 
  
 
===GetExternSymbol===
 
===GetExternSymbol===
Il metodo ''GetExternSymbol()'' restituisce un puntatore ad un simbolo di una libreria dinamica condivisa esterna.
+
Il Metodo ".GetExternSymbol()" restituisce un ''Puntatore'' ad un simbolo di una libreria condivisa esterna. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
 
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  GetExternSymbol (Libreria As String, Simbolo As String) As Pointer
 
  GetExternSymbol (Libreria As String, Simbolo As String) As Pointer
Il nome della libreria dinamica esterna va definito senza l'estensione "''.so''" .
+
Il nome della libreria esterna va definito senza l'estensione ".so" e senza la eventuale parte finale numerica relativa alla sua versione.
  
 
Se la libreria è posta in una directory diversa da quella standard ''/usr/lib'', nel primo argomento va specificato l'intero percorso della libreria dinamica esterna.
 
Se la libreria è posta in una directory diversa da quella standard ''/usr/lib'', nel primo argomento va specificato l'intero percorso della libreria dinamica esterna.
  
Il nome del simbolo, qualora trattasi di variabile, deve essere una variabile ''globale''.
+
Il simbolo, qualora trattasi di variabile, ''globale''. Può anche essere un simbolo Costante dichiarato in un file d'intestazione di altra libreria esterna, purché tale file d'intestazione sia richiamato con la direttiva "#include" nel file header della libreria che stiamo usando.
 
 
  
 +
===Esempi pratici===
 +
Di seguito alcuni esempi pratici sull'uso del Metodo ".GetExternSymbol()". <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 
====1° esempio====
 
====1° esempio====
Mostriamo un semplice esempio, nel quale abbiamo una semplice libreria esterna, che chiameremo "LibreriaEsempio.c", il cui codice C è il seguente:
+
Mostriamo un semplice esempio, nel quale abbiamo una semplice libreria condivisa esterna, che chiameremo "LibreriaEsempio.c", il cui codice C è il seguente:
 
  struct STRUTTURA {
 
  struct STRUTTURA {
 
   int i;
 
   int i;
Riga 199: Riga 183:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
 
    
 
    
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
+
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
 
   
 
   
 
  <Font Color=gray>' ''Puntiamo alla variabile della "Struttura" presente nella libreria esterna:''</font>
 
  <Font Color=gray>' ''Puntiamo alla variabile della "Struttura" presente nella libreria esterna:''</font>
  p = System.<Font Color=#B22222>GetExternSymbol("/tmp/LibreriaEsempio", "stru")</font>
+
  p = System.<Font Color=red>GetExternSymbol("/tmp/LibreriaEsempio", "stru")</font>
 
   
 
   
 
  <Font Color=gray>' ''Passiamo alla funzione della libreria esterna il puntatore alla "Struttura" esterna ed un Intero:''</font>
 
  <Font Color=gray>' ''Passiamo alla funzione della libreria esterna il puntatore alla "Struttura" esterna ed un Intero:''</font>
  Esempio(p, 9999)
+
  Esempio(p, 9999)
 
   
 
   
 
  <Font Color=gray>' ''Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il puntatore alla "Struttura" medesima:''</font>
 
  <Font Color=gray>' ''Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il puntatore alla "Struttura" medesima:''</font>
  Print Int@(p)
+
  Print Int@(p)
  p = p + 4
+
  Print Short@(p + 4)
  Print Short@(p)
 
 
   
 
   
  '''End'''
+
  End
  
 +
====2° esempio====
 +
Nell'esempio, che segue, è prevista una libreria condivisa esterna contenente semplicemente la dichiarazione di una ''Struttura''. Nel codice Gambas si provvederà ad ottenere un ''Puntatore'' alla variabile della ''Struttura'' esterna, presente nella libreria condivisa esterna, nel quale successivamente si scriveranno i dati in un uno o più membri della ''Struttura'' medesima.
  
====2° esempio====
 
Nell'esempio, che segue, è prevista una libreria dinamica esterna contenente semplicemente la dichiarazione di una ''Struttura''. Nel codice Gambas si provvederà ad ottenere un ''Puntatore'' alla variabile della ''Struttura'' esterna, presente nella libreria dinamica esterna, nel quale successivamente si scriveranno i dati in un uno o più membri della ''Struttura'' medesima.
 
 
Il codice C della libreria dinamica esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:
 
Il codice C della libreria dinamica esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:
 
  struct STRUTTURA {
 
  struct STRUTTURA {
Riga 232: Riga 215:
  
 
Il codice principale di Gambas sarà:
 
Il codice principale di Gambas sarà:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
+
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
 
   
 
   
 
  <Font Color=gray>' ''Puntiamo alla variabile della "Struttura" presente nella libreria esterna:''</font>
 
  <Font Color=gray>' ''Puntiamo alla variabile della "Struttura" presente nella libreria esterna:''</font>
  p = System.<Font Color=#B22222>GetExternSymbol("/tmp/LibreriaEsempio", "stru")</font>
+
  p = System.<Font Color=red>GetExternSymbol("/tmp/LibreriaEsempio", "stru")</font>
 
   
 
   
 
  <Font Color=gray>' ''Dal "Puntatore" alla "Struttura" estrna creiamo una variabile di tipo "Stream", per poter scrivere nell'area di memoria del "Puntatore" medesimo:''</font>
 
  <Font Color=gray>' ''Dal "Puntatore" alla "Struttura" estrna creiamo una variabile di tipo "Stream", per poter scrivere nell'area di memoria del "Puntatore" medesimo:''</font>
  st = Memory p For Write
+
  st = Memory p For Write
  Write #st, 9999 As Integer
+
  Write #st, 9999 As Integer
  Write #st, 888 As Short
+
  Write #st, 888 As Short
  st.Close
+
  st.Close
 
   
 
   
 
  <Font Color=gray>' ''Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il Puntatore alla "Struttura" medesima:''</font>
 
  <Font Color=gray>' ''Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il Puntatore alla "Struttura" medesima:''</font>
  Print Int@(p)
+
  Print Int@(p)
  p = p + 4
+
  Print Short@(p + 4)
  Print Short@(p)
 
 
   
 
   
  '''End'''
+
  End
  
 +
====3° esempio====
 +
In questo esempio si assegnerà un valore a due membri della ''Struttura'' esterna utilizzando per ciascuna assegnazione anche una specifica funzione nella libreria condivisa esterna.
  
====3° esempio====
+
Il codice C della libreria condivisa esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:
In questo esempio si assegnerà un valore a due membri della ''Struttura'' esterna utilizzando per ciascuna assegnazione anche una specifica funzione nella libreria dinamica esterna:
 
Il codice C della libreria dinamica esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:
 
 
  struct STRUTTURA {
 
  struct STRUTTURA {
 
   int i;
 
   int i;
Riga 289: Riga 271:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
 
   
 
   
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
+
  Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait
 
   
 
   
  p = System.GetExternSymbol("/tmp/LibreriaEsempio", "stru")
+
  p = System.GetExternSymbol("/tmp/LibreriaEsempio", "stru")
 
   
 
   
  Scrive_StruInt(p, 9999)
+
  Scrive_StruInt(p, 9999)
 
   
 
   
  Scrive_StruSho(p, 777)
+
  Scrive_StruSho(p, 777)
 
    
 
    
  Print Int@(p)
+
  Print Int@(p)
  p = p + 4
+
  Print Short@(p + 4)
  Print Short@(p)
 
 
   
 
   
  '''End'''
+
  End
  
 
===GetFormat===
 
===GetFormat===
  
 
===Log===
 
===Log===
 +
 +
 +
 +
----
 +
=Note=
 +
[1] Vedere anche la seguente pagina: [[Ottenere l'indirizzo e il valore di una Costante e di una variabile globale situate in una libreria condivisa]]
 +
 +
[2] Per un ulteriore esempio vedere la seguente pagina: [[Ottenere la descrizione del tipo di errore dai file header "errno-base.h" e "errno.h"]]

Versione attuale delle 15:41, 11 lug 2024

La Classe statica System dispone di Costanti, di Proprietà e di Metodi.


Costanti e Proprietà

La Classe System offre informazioni generali circa l'ambiente del sistema operativo.

Architecture

Backtrace

BreackOnError

ByteOrder

La Proprietà ".ByteOrder" ritorna un valore intero che rappresenta l'ordine dei byte del sistema.

Tale ordine può essere:

  • gb.LittleEndian = 0 (LittleEndian);
  • gb.BigEndian = 1 (BigEndian).

La sua sintassi è:

System.ByteOrder As Integer

Charset

Cores

Domain

Error

Restituisce il codice di errore Unix dell'ultimo errore generato da una chiamata di sistema, che corrisponde al Puntatore dereferenziato della funzione "__errno_location()".

Family

FirstDayOfWeek

La Proprietà ".FirstDayOfWeek" ritorna la rappresentazione numerica del primo giorno della settimana, sulla base della corrente lingua e localizzazione.

La sua sintassi è:

System.FirstDayOfWeek As Integer

Per l'Italia il primo giorno della settimana è rappresentato con il numero " 1 " (quindi: lunedì = 1, domenica = 7).

FullVersion

La Costante ".FullVersion" ritorna una stringa che rappresenta la versione attuale completa dell'interpete di Gambas.

La sua sintassi è:

Const FullVersion As String = "3.6.0"

Host

La Proprietà ".Host" ritorna una stringa che rappresenta l'host name del sistema operativo.

La sua sintassi è:

System.Host As String

IgnoreOverflow

Language

La Proprietà ".Language" ritorna o imposta una stringa che rappresenta la corrente lingua del sistema.

La sua sintassi è:

System.Language As String

Esempio:

Publi' Sub Main()

' Verifica la lingua impostata corrente del sistema:
 Print System.Language

' Imposta una nuova la lingua del sistema:
 System.Language = "fr_Fr"

End

Path

La proprietà .Path ritorna una stringa che rappresenta il percorso ove è installato Gambas.

La sua sintassi è:

System.Path As String

Profile

RightToLeft

Shell

La Proprietà ".Shell" ritorna o imposta la "shell" che viene, o sarà, utilizzata quando si invierà il comando Shell. Se non viene impostato, viene usato come predefinita la Shell con percorso "/bin/sh".

La sua sintassi è:

Shell As String

Se, per esempio, viene creata un'applicazione 'a riga di comando' contenente il seguente codice:

Private Sub Main()

 Exec [System.Shell]

End

e viene lanciata in un Terminale, sarà disponibile all'interno di quel medesimo Terminale una Shell con tutte le sue funzionalità.

Come detto all'inizio, si potrà anche scegliere la "shell" da utilizzare assegnandola alla Proprietà ".Shell". <>BR>Esempio:

System.Shell = System.Find("bash")

Si segnala anche la lettura della pagina "Rendere la console dell'IDE funzionale come un Terminale" di questa WIKI.

TimeZone

La Proprietà ".TimeZone" ritorna un Intero che rappresenta il numero dei secondi da aggiungere al fuso orario locale per ottenere il fuso orario UTC.
La logica è invertita con il modo in cui il fuso orario viene solitamente stampato: se UTC+2, "Sytem.Timezone" restituirà -7200.

La sua sintassi è:

System.TimeZone As Integer

Trace

User

Version

La Costante ".Version" ritorna una stringa che rappresenta la versione attuale dell'interprete di Gambas.

La sua sintassi è:

Const Version As String = "3"


Metodi

I Metodi della Classe System sono i seguenti:

Exist

Il Metodo ".Exist()" ritorna il valore Vero, se esiste all'interno della variabile d'ambiente PATH del sistema il programma specificato nel suo parametro.

La sua sintassi è:

System.Exist(programma As String) As Boolean


Esempio:

Public Sub Main()

  Print System.Exist("gedit")

End

Find

Il Metodo ".Find()" cerca all'interno della variabile d'ambiente PATH del sistema il programma specificato nel suo parametro e, se trovato, ne ritorna il percorso completo.

La sua sintassi è:

System.Find(programma As String) As String

Esempio:

Public Sub Main()

  Print System.Find("gedit")

End

GetExternSymbol

Il Metodo ".GetExternSymbol()" restituisce un Puntatore ad un simbolo di una libreria condivisa esterna. [nota 1]

La sua sintassi è:

GetExternSymbol (Libreria As String, Simbolo As String) As Pointer

Il nome della libreria esterna va definito senza l'estensione ".so" e senza la eventuale parte finale numerica relativa alla sua versione.

Se la libreria è posta in una directory diversa da quella standard /usr/lib, nel primo argomento va specificato l'intero percorso della libreria dinamica esterna.

Il simbolo, qualora trattasi di variabile, globale. Può anche essere un simbolo Costante dichiarato in un file d'intestazione di altra libreria esterna, purché tale file d'intestazione sia richiamato con la direttiva "#include" nel file header della libreria che stiamo usando.

Esempi pratici

Di seguito alcuni esempi pratici sull'uso del Metodo ".GetExternSymbol()". [nota 2]

1° esempio

Mostriamo un semplice esempio, nel quale abbiamo una semplice libreria condivisa esterna, che chiameremo "LibreriaEsempio.c", il cui codice C è il seguente:

struct STRUTTURA {
  int i;
  short s;
  char c;
  long l;
} stru;


void Esempio(struct STRUTTURA * p, int v) {

  p->i = v;
  p->s = (short) v - 9000;

}

Il codice sorgente di detta libreria condivisa sarà posto nella cartella Dati del nostro progetto.


Il codice principale di Gambas sarà:

Private Extern Esempio(po As Pointer, valore As Integer) As Pointer In "/tmp/LibreriaEsempio"


Public Sub Main()

 Dim p As Pointer
 
 Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait

' Puntiamo alla variabile della "Struttura" presente nella libreria esterna:
 p = System.GetExternSymbol("/tmp/LibreriaEsempio", "stru")

' Passiamo alla funzione della libreria esterna il puntatore alla "Struttura" esterna ed un Intero:
 Esempio(p, 9999)

' Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il puntatore alla "Struttura" medesima:
 Print Int@(p)
 Print Short@(p + 4)

End

2° esempio

Nell'esempio, che segue, è prevista una libreria condivisa esterna contenente semplicemente la dichiarazione di una Struttura. Nel codice Gambas si provvederà ad ottenere un Puntatore alla variabile della Struttura esterna, presente nella libreria condivisa esterna, nel quale successivamente si scriveranno i dati in un uno o più membri della Struttura medesima.

Il codice C della libreria dinamica esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:

struct STRUTTURA {
  int i;
  short s;
  char c;
  long l;
} stru;

Il codice sorgente di detta libreria condivisa sarà posto nella cartella Dati del nostro progetto.


Il codice principale di Gambas sarà:

Public Sub Main()

 Dim p As Pointer
 Dim st As Stream
 
 Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait

' Puntiamo alla variabile della "Struttura" presente nella libreria esterna:
 p = System.GetExternSymbol("/tmp/LibreriaEsempio", "stru")

' Dal "Puntatore" alla "Struttura" estrna creiamo una variabile di tipo "Stream", per poter scrivere nell'area di memoria del "Puntatore" medesimo:
 st = Memory p For Write
 Write #st, 9999 As Integer
 Write #st, 888 As Short
 st.Close

' Per leggere il valore di due membri della "Struttura" esterna, derefenziamo il Puntatore alla "Struttura" medesima:
 Print Int@(p)
 Print Short@(p + 4)

End

3° esempio

In questo esempio si assegnerà un valore a due membri della Struttura esterna utilizzando per ciascuna assegnazione anche una specifica funzione nella libreria condivisa esterna.

Il codice C della libreria condivisa esterna, che chiameremo "LibreriaEsempio.c", è dunque il seguente:

struct STRUTTURA {
  int i;
  short s;
  char c;
  long l;
} stru;


void Scrive_Stru(struct STRUTTURA *p, int v) {

   p->i = v;

}

void Scrive_StruSho(struct STRUTTURA *p, short v) {

   p->s = v;

}

Il codice sorgente di detta libreria condivisa sarà posto nella cartella Dati del nostro progetto.


Il codice principale di Gambas sarà:

Library "/tmp/LibreriaEsempio"


Private Extern Scrive_StruInt(po As Pointer, valore As Integer)
Private Extern Scrive_StruSho(po As Pointer, valore As Short)


Public Sub Main()

 Dim p As Pointer

 Shell "gcc -o /tmp/LibreriaEsempio.so " &/ Application.Path &/ "LibreriaEsempio.c -shared" Wait

 p = System.GetExternSymbol("/tmp/LibreriaEsempio", "stru")

 Scrive_StruInt(p, 9999)

 Scrive_StruSho(p, 777)
 
 Print Int@(p)
 Print Short@(p + 4)

End

GetFormat

Log


Note

[1] Vedere anche la seguente pagina: Ottenere l'indirizzo e il valore di una Costante e di una variabile globale situate in una libreria condivisa

[2] Per un ulteriore esempio vedere la seguente pagina: Ottenere la descrizione del tipo di errore dai file header "errno-base.h" e "errno.h"