Post by lab on Sept 11, 2010 1:34:54 GMT 1
Greetings, nice to se the new forum !
I have been trying to port some math program, using the GNU GMP Multiple Precision Arithmetic which is huge and fast.
can somebody tell me how to interface to the DLL,
first a sample in Powerbasic, then GFA:
' Powerbasic example
TYPE MPZ ' multiprecision integer
mp_alloc AS LONG
mp_size AS LONG
mp_limb AS LONG
END TYPE
DECLARE SUB cMPZinit CDECL LIB "gmp.dll" ALIAS "__gmpz_init" (BYREF X AS MPZ)
DECLARE SUB cMPZfac CDECL LIB "gmp.dll" ALIAS "__gmpz_fac_ui" (BYREF Y AS MPZ,BYVAL X AS DWORD)
DECLARE SUB cMPZclear CDECL LIB "gmp.dll" ALIAS "__gmpz_clear" (BYREF X AS MPZ)
DECLARE SUB cMPFsprintfs CDECL LIB "gmp.dll" ALIAS "__gmp_sprintf" (BYREF s AS ASCIIZ,BYREF fmt AS ASCIIZ,BYREF X AS MPZ)
DECLARE SUB cMPFsprintf CDECL LIB "gmp.dll" ALIAS "__gmp_sprintf" ( BYVAL s AS DWORD,BYREF fmt AS ASCIIZ,BYREF X AS MPZ)
FUNCTION PBMAIN () AS LONG
DIM k AS MPZ 'multiprecision integer
DIM a AS STRING
DIM b AS ASCIIZ*50
DIM f AS ASCIIZ*20
DIM n AS DWORD
cMPZinit(k)
n=4
cMPZfac(k,n)
a=SPACE$(k.mp_size*10)
b=SPACE$(40)
f="%Zd"
cMPFsprintf(STRPTR(a),f,k)
MSGBOX STR$(n)+" ! = "+a
cMPFsprintfs(b,f,k)
MSGBOX STR$(n)+" ! = "+b
cMPZclear(k)
END FUNCTION
---------------------------
I have only have succeded this way in GFA:
and can't sort out how to pass string parameters like ASCIIZ
by declare !
' GFABASIC32 example
' GMP info: gmplib.org/
' get dll from www.cs.nyu.edu/exact/core/gmp/
' direct link: www.cs.nyu.edu/exact/core/gmp/gmp-static-vc-4.1.2.zip
'
Global h As Handle = LoadLibrary("gmp.dll")
Global gmpinit = GetProcAddress(h, "__gmpz_init")
Global gmpclear = GetProcAddress(h, "__gmpz_clear")
Global gmpfac = GetProcAddress(h, "__gmpz_fac_ui")
Global gmpsprint = GetProcAddress(h, "__gmp_sprintf")
Type MPZ ' multiprecision integer
mp_alloc As Long
mp_size As Long
mp_limb As Long
End Type
Debug.Show
Dim k As MPZ 'multiprecision integer
Dim a As String
Dim f As String
Dim n As Long
f = "%Zd"
n = 50
Debug "Factorial ";n;" ="
Void CCall (gmpinit)(*k)
Void CCall (gmpfac)(*k, n)
a = Space(10 * k.mp_size + 10)
Void CCall (gmpsprint)(V:a, V:f, *k)
'Debug Len(CharPeek(V:a)) / k.mp_size
Debug a
Void CCall (gmpclear)(*k)
~FreeLibrary(h)
' sincerely Lab
I have been trying to port some math program, using the GNU GMP Multiple Precision Arithmetic which is huge and fast.
can somebody tell me how to interface to the DLL,
first a sample in Powerbasic, then GFA:
' Powerbasic example
TYPE MPZ ' multiprecision integer
mp_alloc AS LONG
mp_size AS LONG
mp_limb AS LONG
END TYPE
DECLARE SUB cMPZinit CDECL LIB "gmp.dll" ALIAS "__gmpz_init" (BYREF X AS MPZ)
DECLARE SUB cMPZfac CDECL LIB "gmp.dll" ALIAS "__gmpz_fac_ui" (BYREF Y AS MPZ,BYVAL X AS DWORD)
DECLARE SUB cMPZclear CDECL LIB "gmp.dll" ALIAS "__gmpz_clear" (BYREF X AS MPZ)
DECLARE SUB cMPFsprintfs CDECL LIB "gmp.dll" ALIAS "__gmp_sprintf" (BYREF s AS ASCIIZ,BYREF fmt AS ASCIIZ,BYREF X AS MPZ)
DECLARE SUB cMPFsprintf CDECL LIB "gmp.dll" ALIAS "__gmp_sprintf" ( BYVAL s AS DWORD,BYREF fmt AS ASCIIZ,BYREF X AS MPZ)
FUNCTION PBMAIN () AS LONG
DIM k AS MPZ 'multiprecision integer
DIM a AS STRING
DIM b AS ASCIIZ*50
DIM f AS ASCIIZ*20
DIM n AS DWORD
cMPZinit(k)
n=4
cMPZfac(k,n)
a=SPACE$(k.mp_size*10)
b=SPACE$(40)
f="%Zd"
cMPFsprintf(STRPTR(a),f,k)
MSGBOX STR$(n)+" ! = "+a
cMPFsprintfs(b,f,k)
MSGBOX STR$(n)+" ! = "+b
cMPZclear(k)
END FUNCTION
---------------------------
I have only have succeded this way in GFA:
and can't sort out how to pass string parameters like ASCIIZ
by declare !
' GFABASIC32 example
' GMP info: gmplib.org/
' get dll from www.cs.nyu.edu/exact/core/gmp/
' direct link: www.cs.nyu.edu/exact/core/gmp/gmp-static-vc-4.1.2.zip
'
Global h As Handle = LoadLibrary("gmp.dll")
Global gmpinit = GetProcAddress(h, "__gmpz_init")
Global gmpclear = GetProcAddress(h, "__gmpz_clear")
Global gmpfac = GetProcAddress(h, "__gmpz_fac_ui")
Global gmpsprint = GetProcAddress(h, "__gmp_sprintf")
Type MPZ ' multiprecision integer
mp_alloc As Long
mp_size As Long
mp_limb As Long
End Type
Debug.Show
Dim k As MPZ 'multiprecision integer
Dim a As String
Dim f As String
Dim n As Long
f = "%Zd"
n = 50
Debug "Factorial ";n;" ="
Void CCall (gmpinit)(*k)
Void CCall (gmpfac)(*k, n)
a = Space(10 * k.mp_size + 10)
Void CCall (gmpsprint)(V:a, V:f, *k)
'Debug Len(CharPeek(V:a)) / k.mp_size
Debug a
Void CCall (gmpclear)(*k)
~FreeLibrary(h)
' sincerely Lab