Gli utenti
iscritti al forum possono scaricare una libreria dinamica condivisa, "
grandinumeri.so", che ho compilato dai sorgenti, scritti in C, del seguente progetto:
- Progetto:
BigNumber- Autori:
Davide Zanin, Frhack3r- Linguaggio:
C- Licenza: GNU G.P.L.
- Versione: 1.5
La libreria è progettata per la gestione di numeri in precisione arbitraria. Questo significa che potete utilizzare numeri di dimensioni molto maggiori dei numeri standard di Gambas o del C. Allo stato attuale è possibile usare solo i numeri interi positivi con un massimo di
32768 cifre !!!
Come utilizzarla in Gambas:
1) scaricare il file qui sotto allegato e decomprimerlo.
2) nel progetto Gambas richiamare la libreria avendo cura di specificare il suo esatto percorso, ed eliminando l'estensione .so .
3) poiché la libreria è una libreria condivisa .so, le funzioni in essa contenute, da utilizzare in gambas, andranno dichiarate mediante la ormai nota parola-chave "
Extern".
4) le principali funzioni previste dalla libreria .so ed utilizzabili in Gambas sono:
- void bInit (int)
- Funzione che inizializza la libreria.
- Private Extern bInit(lungMax As Integer)
- BigN bIntero (void)
- Funzione che prepara un area di memoria che rappresenta un numero.
- Private Extern bIntero() As BigN
- char bLeggi (BigN)
- Funzione che legge un BigN.
- Private Extern bLeggi(bn As BigN) As Byte
- BigN bSot (BigN, BigN)
- Funzione che esegue la sottrazione tra 2 numeri.
- Private Extern bSot(bn As BigN, bm As BigN) As BigN
- BigN bSomma (BigN, BigN)
- Funzione che esegue la somma tra 2 numeri.
- Private Extern bSomma(bn As BigN, bm As BigN) As BigN
- BigN bMol (BigN, BigN)
- Funzione che esegue la moltiplicazione tra 2 numeri.
- Private Extern bMol(bn As BigN, bm As BigN) As BigN
- BigN bDiv (BigN, BigN)
- Funzione che esegue la divisione intera.
- Private Extern bDiv(bn As BigN, bm As BigN) As BigN
- char bStampa (BigN)
- Funzione che stampa un numero.
- Private Extern bStampa(bn As BigN) As Byte
Mostriamo un esempio pratico, nel quale la libreria condivisa si presume essere posta nella cartella /tmp :
Library "/tmp/grandinumeri"
Public Struct BigN
lun As Integer
pun As Pointer
End Struct
' void bInit (int)
' Funzione che inizializza la libreria.
Private Extern bInit(lungMax As Integer)
' BigN bIntero (void)
' Funzione che prepara un area di memoria che rappresenta un numero.
Private Extern bIntero() As BigN
' char bLeggi (BigN)
' Funzione che legge un BigN.
Private Extern bLeggi(bn As BigN) As Byte
' BigN bSot (BigN, BigN)
' Funzione che esegue la sottrazione tra 2 numeri.
Private Extern bSot(bn As BigN, bm As BigN) As BigN
' BigN bSomma (BigN, BigN)
' Funzione che esegue la somma tra 2 numeri.
Private Extern bSomma(bn As BigN, bm As BigN) As BigN
' BigN bMol (BigN, BigN)
' Funzione che esegue la moltiplicazione tra 2 numeri.
Private Extern bMol(bn As BigN, bm As BigN) As BigN
' BigN bDiv (BigN, BigN)
' Funzione che esegue la divisione intera.
Private Extern bDiv(bn As BigN, bm As BigN) As BigN
' char bStampa (BigN)
' Funzione che stampa un numero.
Private Extern bStampa(bn As BigN) As Byte
Public Sub Main()
Dim n, m, somma, sot, mol, dv As BigN
' All'inizio di ogni programma deve SEMPRE essere impostato questo argomento,
' che specifica la lunghezza massima che avranno i BigN che utilizzerete:
bInit(500)
' Prepara l'area di memoria che conterrà le variabili n e m.
' Va sempre effettuata su ogni variabile dichiarata di tipo BigN che si legge da tastiera:
n = bIntero()
m = bIntero()
' Legge un numero:
Print "Verranno effettuate le 4 operazioni tra 2 numeri.\nInserisci due numeri premendo 'Invio' ad ogni numero..."
bLeggi(n)
bLeggi(m)
' bSot restituisce il risultato di n - m:
sot = bSot(n, m)
' bSomma restituisce il risultato di n + m:
somma = bSomma(n, m)
' bMolt restituisce il risultato di n * m:
mol = bMol(n, m)
' bDiv restituisce il risultato della divisione intera di n / m
dv = bDiv(n, m)
' Stampa a video dei risultati:
Print "\nSottrazione tra i due BigN:"
bStampa(sot)
Print "\n\nAddizione tra i due BigN:"
bStampa(somma)
Print "\n\nMoltiplicazione tra i due BigN:"
bStampa(mol)
Print "\n\nDivisione tra i due BigN:"
bStampa(dv)
End
Riferimenti opportuni:
*
http://www.pierotofy.it/pages/projects/project_209.html*
http://www.gambas-it.org/wiki/index.php?title=Extern:_richiamare_funzioni_esterne_a_Gambas