Spanish Retomando B4A. ¿No se pueden definir Funciones en B4A?

ngr888

Member
Hola, tras un primer intento de usar este lenguaje hace dos años, vuelvo a usar B4A con algo más de fortuna. Pero con muchas dudas.
Adaptando un programa escrito en Visual Basic necesito manejar por separado el signo y el valor absoluto de un resultado aritmético.
En vB uso a = Sgn(n) y b = Abs(n)
En B4A ecuentro Abs(n), pero no localizo una función similar a Sgn()
¿Existe? Hago código para solucionarlo, pero es incómodo.

Aunque B4A es un lenguaje extraordinario y muy completo, el no poder usar funciones definidas por el usuario lo veo como una carencia.

El libro "B4A Rapid Android App" me está sirviendo de una gran ayuda, pero sus 756 páginas abruman un poco.

Saludos y gracias por vuestra atención.
 

ngr888

Member
En vB uso a = Sgn(n) y b = Abs(n)
En B4A ecuentro Abs(n), pero no localizo una función similar a Sgn()
Vale... Ya vi...

No existe función Sgn() en B4A.
Escribiré una rutina que me devuelva -1, 0 ó 1 según proceda.
También lo haré para intercambiar el valor de dos variables. Swap(a As Int, b As Int), que tampoco parece existir (de momento sólo valores enteros).

En este caso lo resolvía recurriendo variables tipo "variant". Supongo que en B4A podrían declararse como tipo "object", pero todavía no sé hacerlo, ¡que deben ser del mismo tipo, claro!

Algo así como
Sub Swap(a As object, b As object) As object
Private t As object
t = a : a =b : b=t
Return a, b
En sub
 

EnriqueGonzalez

Well-Known Member
Licensed User
Longtime User
el no poder usar funciones definidas por el usuario lo veo como una carencia.
No entendí tu comentario. Tu puedes declarar funciones como

B4X:
Sub nombre(parametro as tipoParametro) as valorRetorno
Return ""

End Sub
 

ngr888

Member
Hola, Enrique.
No debí expresarme bien.
La función Sgn(x) me resultaba útil en ciertos casos. Por ejemplo: si uso una variable cuyo valor depende de ciertos cálculos internos, en un momento dado no conozco su contenido, pero quiero bifurcar a un código u otro en función de su signo (independientemente de su valor absoluto). Algo así:

B4X:
x = Sin(alfa) - 0.23
Select Sgn(x)
  case -1
    ...
  case 0
    ...
  case 1
    ...
End select

En cuanto a las funciones, veo que pedo usar Sub junto con "return", pero con una particularidad...
Creo entender que B4x pasa siempre (?) los parámetros por referencia.

Las funciones que usaba pueden manejar los argumentos tanto por referencia (ByRef) como por valor (ByVal) -una copia-. Algo así:

B4X:
x = 2*h+23
y = raiz(x)

' ----------------

Def Function raiz(ByVal numero As double) As double
  numero = Sqrt(numero)
  return numero
End function

Eso dejaría el valor de "y" sin cambios.

En cualquier caso no me supone problema el que no existan funciones definidas por el usuario.

Gracias. Un saludo.
 

klaus

Expert
Licensed User
Longtime User
In B4A values are always transmitted ByVal.

And the Sgn function:
B4X:
Public Sub Sgn(Number As Double) As Int
    If Number = 0 Then
        Return 0
    Else if Number / Abs(Number) > 0 Then
        Return 1
    Else
        Return -1
    End If
End Sub
 

ngr888

Member
Thank you Klaus.
Is necessary to divide?

My Subroutine as a function is:

B4X:
Public Sub Sgn(Number As Double) As Int
  If Number = 0 Then
    Return 0
  Else if Number < 0 Then
    Return -1
  Else
    Return 1
  End If
End Sub

which also works for me.

Greetings.
 

klaus

Expert
Licensed User
Longtime User
Is necessary to divide?
No !
Why doing things simply when we can do them more complicated ?
The routine from post #6 could be simplified like below. But yours is the simplest.
B4X:
Public Sub Sgn(Number As Double) As Int
    If Number = 0 Then
        Return 0
    Else
        Number / Abs(Number)
    End If
End Sub
 

ngr888

Member
No !
Why doing things simply when we can do them more complicated ?
The routine from post #6 could be simplified like below. But yours is the simplest.
B4X:
Public Sub Sgn(Number As Double) As Int
    If Number = 0 Then
        Return 0
    Else
        Number / Abs(Number)
    End If
End Sub
Hi.
I like the new one code.

Now the división by Abs(number), retur the suitable sing: -1or 1

:) :) :)

Thanks.
 
Top