Autore Topic: Libreria condivisa .so per la gestione di numeri fino a 32768 cifre  (Letto 492 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
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 :
Codice: [Seleziona]
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


« Ultima modifica: 03 Settembre 2020, 16:14:13 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re:Libreria condivisa .so per la gestione di numeri fino 32768 cifre
« Risposta #1 il: 27 Aprile 2017, 23:54:09 »
Ma nei componenti di Gambas non c'è già il componente gb.gmp che contiene il tipo BigInt per la gestione di numeri interi enormi? Ho già provato ad usarlo ma senza riuscire a capire come va usato.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Libreria condivisa .so per la gestione di numeri fino 32768 cifre
« Risposta #2 il: 28 Aprile 2017, 00:00:21 »
Ma nei componenti di Gambas non c'è già il componente gb.gmp che contiene il tipo BigInt per la gestione di numeri interi enormi?
Ma in Gambas non ci sono perfino 5 Componenti grafici ?     :hard:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »