Conversão de fragmento de código xBase para C usando a API
Enviado: 08 Ago 2013 16:32
Pessoal,
Boa tarde.
Estou me familiarizando com ambiente Harbour e, para isso, estou fazendo um programa para calcular números muito grandes, ao estilo BIGNUM do Java. É um programa didático que me permite explorar as características e o poder da linguagem. Acontece que alguns fragmentos do código teriam um melhor desempenho se fossem escritos diretamente em C e estou tendo uma certa dificuldade por não conhecer a fundo a API do Harbour. Será que poderia me ajudar? O Código fonte está no GitHub: github.com/NaldoDj/tBigNumber e as funções que quero converter para C são as: ADD, Sub e Mult.
Alguém poderia me auxiliar?
[]s
Naldo
Boa tarde.
Estou me familiarizando com ambiente Harbour e, para isso, estou fazendo um programa para calcular números muito grandes, ao estilo BIGNUM do Java. É um programa didático que me permite explorar as características e o poder da linguagem. Acontece que alguns fragmentos do código teriam um melhor desempenho se fossem escritos diretamente em C e estou tendo uma certa dificuldade por não conhecer a fundo a API do Harbour. Será que poderia me ajudar? O Código fonte está no GitHub: github.com/NaldoDj/tBigNumber e as funções que quero converter para C são as: ADD, Sub e Mult.
Código: Selecionar todos
#IFDEF TBN_ARRAY
/*
Funca : Add
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Adicao
Sintaxe : Add(a,b,n,nBase) -> cNR
*/
Static Function Add(a,b,n,nBase)
Local y := n+1
Local c := aFill(aSize(__aZAdd,y),0)
Local k := 1
While n>0
#IFDEF __PROTHEUS__
c[k] += Val(SubStr(a,n,1))+Val(SubStr(b,n,1))
#ELSE
c[k] += Val(a[n])+Val(b[n])
#ENDIF
IF c[k]>=nBase
c[k+1] += 1
c[k] -= nBase
EndIF
++k
--n
End While
Return(aGetcN(c,y))
/*
Funcao : Sub
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Subtracao
Sintaxe : Sub(a,b,n,nBase) -> cNR
*/
Static Function Sub(a,b,n,nBase)
Local y := n
Local c := aFill(aSize(__aZSub,y),0)
Local k := 1
While n>0
#IFDEF __PROTHEUS__
c[k] += Val(SubStr(a,n,1))-Val(SubStr(b,n,1))
#ELSE
c[k] += Val(a[n])-Val(b[n])
#ENDIF
IF c[k]<0
c[k+1] -= 1
c[k] += nBase
EndIF
++k
--n
End While
Return(aGetcN(c,y))
/*
Funcao : Mult
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Multiplicacao de Inteiros
Sintaxe : Mult(cN1,cN2,n,nBase) -> cNR
Obs. : Mais rapida,usa a multiplicacao nativa
*/
Static Function Mult(cN1,cN2,n,nBase)
Local a := tBigNInvert(cN1,n)
Local b := tBigNInvert(cN2,n)
Local y := n+n
Local c := aFill(aSize(__aZMult,y),0)
Local i := 1
Local k := 1
Local l := 2
Local s
Local x
Local j
While i<=n
s := 1
j := i
While s<=i
#IFDEF __PROTHEUS__
c[k] += Val(SubStr(a,s++,1))*Val(SubStr(b,j--,1))
#ELSE
c[k] += Val(a[s++])*Val(b[j--])
#ENDIF
End While
IF c[k]>=nBase
x := k+1
c[x] := Int(c[k]/nBase)
c[k] -= c[x]*nBase
EndIF
k++
i++
End While
While l<=n
s := n
j := l
While s>=l
#IFDEF __PROTHEUS__
c[k] += Val(SubSTr(a,s--,1))*Val(SubSTr(b,j++,1))
#ELSE
c[k] += Val(a[s--])*Val(b[j++])
#ENDIF
End While
IF c[k]>=nBase
x := k+1
c[x] := Int(c[k]/nBase)
c[k] -= c[x]*nBase
EndIF
k++
IF k>=y
EXIT
EndIF
l++
End While
Return(aGetcN(c,k))
/*
Funcao : aGetcN
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Montar a String de Retorno
Sintaxe : aGetcN(a,x) -> s
*/
Static Function aGetcN(a,n)
Local s := ""
Local y := n
While y>=1
While y>=1 .and. a[y]==0
y--
End While
While y>=1
s += hb_ntos(a[y])
y--
End While
End While
IF s==""
s := "0"
EndIF
IF Len(s)<n
s := PadL(s,n,"0")
EndIF
Return(s)
#ELSE
/*
Funcao : Add
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Adicao
Sintaxe : Add(a,b,n,nBase) -> cNR
*/
Static Function Add(a,b,n,nBase)
Local c
Local y := n+1
Local k := 1
Local v := 0
Local v1
While y>__nstcZ0
__cstcZ0+=SubStr(__cstcZ0,1,__nstcZ0)
__nstcZ0+=__nstcZ0
End While
c := SubStr(__cstcZ0,1,y)
While n>0
#IFDEF __PROTHEUS__
v += Val(SubStr(a,n,1))+Val(SubStr(b,n,1))
#ELSE
v += Val(a[n])+Val(b[n])
#ENDIF
IF v>=nBase
v -= nBase
v1 := 1
Else
v1 := 0
EndIF
#IFDEF __PROTHEUS__
c := Stuff(c,k,1,hb_ntos(v))
c := Stuff(c,k+1,1,hb_ntos(v1))
#ELSE
c[k] := hb_ntos(v)
c[k+1] := hb_ntos(v1)
#ENDIF
v := v1
++k
--n
End While
Return(cGetcN(c,y))
/*
Funcao : Sub
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Subtracao
Sintaxe : Sub(a,b,n,nBase) -> cNR
*/
Static Function Sub(a,b,n,nBase)
Local c
Local y := n
Local k := 1
Local v := 0
Local v1
While y>__nstcZ0
__cstcZ0+=SubStr(__cstcZ0,1,__nstcZ0)
__nstcZ0+=__nstcZ0
End While
c := SubStr(__cstcZ0,1,y)
While n>0
#IFDEF __PROTHEUS__
v += Val(SubStr(a,n,1))-Val(SubStr(b,n,1))
#ELSE
v += Val(a[n])-Val(b[n])
#ENDIF
IF v<0
v += nBase
v1 := -1
Else
v1 := 0
EndIF
#IFDEF __PROTHEUS__
c := Stuff(c,k,1,hb_ntos(v))
#ELSE
c[k] := hb_ntos(v)
#ENDIF
v := v1
++k
--n
End While
Return(cGetcN(c,y))
/*
Funcao : Mult
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Multiplicacao de Inteiros
Sintaxe : Mult(cN1,cN2,n,nBase) -> cNR
Obs. : Mais rapida, usa a multiplicacao nativa
*/
Static Function Mult(cN1,cN2,n,nBase)
Local c
Local a := tBigNInvert(cN1,n)
Local b := tBigNInvert(cN2,n)
Local y := n+n
Local i := 1
Local k := 1
Local l := 2
Local s
Local j
Local v := 0
Local v1
While y>__nstcZ0
__cstcZ0+=SubStr(__cstcZ0,1,__nstcZ0)
__nstcZ0+=__nstcZ0
End While
c := SubStr(__cstcZ0,1,y)
While i<=n
s := 1
j := i
While s<=i
#IFDEF __PROTHEUS__
v += Val(SubStr(a,s++,1))*Val(SubStr(b,j--,1))
#ELSE
v += Val(a[s++])*Val(b[j--])
#ENDIF
End While
IF v>=nBase
v1 := Int(v/nBase)
v -= v1*nBase
Else
v1 := 0
EndIF
#IFDEF __PROTHEUS__
c := Stuff(c,k,1,hb_ntos(v))
c := Stuff(c,k+1,1,hb_ntos(v1))
#ELSE
c[k] := hb_ntos(v)
c[k+1] := hb_ntos(v1)
#ENDIF
v := v1
k++
i++
End While
#IFDEF __PROTHEUS__
v := Val(SubStr(c,k,1))
#ELSE
v := Val(c[k])
#ENDIF
While l<=n
s := n
j := l
While s>=l
#IFDEF __PROTHEUS__
v += Val(SubSTr(a,s--,1))*Val(SubSTr(b,j++,1))
#ELSE
v += Val(a[s--])*Val(b[j++])
#ENDIF
End While
IF v>=nBase
v1 := Int(v/nBase)
v -= v1*nBase
Else
v1 := 0
EndIF
#IFDEF __PROTHEUS__
c := Stuff(c,k,1,hb_ntos(v))
c := Stuff(c,k+1,1,hb_ntos(v1))
#ELSE
c[k] := hb_ntos(v)
c[k+1] := hb_ntos(v1)
#ENDIF
v := v1
k++
IF k>=y
EXIT
EndIF
l++
End While
Return(cGetcN(c,k))
/*
Funcao : cGetcN
Autor : Marinaldo de Jesus [http://www.blacktdn.com.br]
Data : 04/02/2013
Descricao : Montar a String de Retorno
Sintaxe : cGetcN(c,n) -> s
*/
Static Function cGetcN(c,n)
Local s := ""
Local y := n
While y>=1
#IFDEF __PROTHEUS__
While y>=1 .and. SubStr(c,y,1)=="0"
#ELSE
While y>=1 .and. c[y]=="0"
#ENDIF
y--
End While
While y>=1
#IFDEF __PROTHEUS__
s += SubStr(c,y,1)
#ELSE
s += c[y]
#ENDIF
y--
End While
End While
IF s==""
s := "0"
EndIF
IF Len(s)<n
s := PadL(s,n,"0")
EndIF
Return(s)
#ENDIF
[]s
Naldo