¿Variable tipo Double con valor Ninguno?

Seguramente cueste entender lo que quiero decir.
Llevo un tiempo haciendo una calculadora parecida a la que trae Mac. Apenas le dedico un rato algunos días. No tengo mucho tiempo libre últimamente.
Me quedé trabado en la parte de las operaciones, sumar, restar… y busqué algún video donde ver como lo hacen para adaptarlo a mi calculadora.
Encontré un ejemplo en Youtube Se trata de una calculadora tipo Windows programada con Visual Basic .Net 2013. Yo la estoy haciendo en Xojo, por supuesto. Pero quería ver como se las arreglaba para hacer la operación matemática sin borrar el último número introducido y usar al mismo tiempo el mismo Textfield para introducir y mostrar los resultados. Vamos, igual que hace la de Mac.
Viendo el código, encontré algo interesante a partir del 5:38
Utiliza una variable que va a contener un valor Double, pero la declara con valor Ninguno.

En VB .Net 2013
Dim ValorResultado as Nullable(Of Double) = Nothing

Si yo declaro una variable tipo Double en Xojo y muestro su valor en un MessageBox convirtiendolo a texto, el valor es 0.000000

Siguiendo con el ejemplo del video, luego ( en el 7:41) utiliza una condición para saber si ValorResultado ha obtenido un primer valor con el código:

En VB . Net 2013
If ValorResultado IsNot Nothing then



End If

Lo que me gustaría saber, es si en Xojo existe la posibilidad de hacer algo como esto, declarar la variable con valor ninguno y luego comprobar mediante una condición, que haya recibido algún valor. Incluso su luego fuese posible en algún punto del código, volver a establecer el valor en ninguno.

Mencionar además que se trataría de hacerlo con una Propiedad de ámbito Publica en la misma ventana.

Espero que se entienda más o menos lo que quiero decir, me explico muy mal :sweat_smile:

Hola, claro que puedes hacer este tipo de comparaciones en Xojo (entre otras).

Lo que no encontrarás es el concepto de “valor no asignado” a tipos de datos primarios.

Var a As Double = 0

If a = 0 then

// Codigo Que se ejecuta si “a” contiene el valor cero.

Else

// Codigo Que se ejecuta en caso contrario

Endif

Puedes echar un vistazo a las comparaciones en este vídeo

1 Like

Esa es una funcionalidad de .Net que Xojo no tiene, seria muy útil si la implementaran.

No hagas caso al ejemplo de javier, es una PESIMA sugerencia que te va a causar muchos problemas y errores dificiles de rastrear si comparas Doubles.

Veras, un tipo de datos Double no se guarda con los valores exactos, si no con aproximaciones, muchas veces tendras que tu double despues de una operación es algo asi como 0.000000000000001, es por eso que en .Net usan la flexibilidad de ponerlo como Nothing en vez de compararlo con 0.

Una opción que tiene Xojo es el metodo Compare del Double con la que puedes ajustar el nivel de tolerancia para hacer una comparación.

Una opción para emular este comportamiento es que lo separes en dos variables diferentes.

.Net
Dim ValorResultado as Nullable(Of Double) = Nothing

Xojo

Dim ValorResultado as Double = 0
Dim ValorResultadoNullable As bollean = False

Cuando veas un “= Nothing” pones ValorResultadoNullable = False, cuando a ValorResultado le asignas otro valor cualquiera, pones ValorResultadoNullable = True. Si, ya se, mucho más enredo que .Net para la misma funcionalidad.

1 Like

Si la variable está a cero, no se ha inicializado (no se ha asignado ningún valor). Por tanto, no entiendo muy bien lo de la pésima sugerencia. Pero bueno, en fin… :slightly_smiling_face:

Lo que me gustaría saber, es si en Xojo existe la posibilidad de hacer algo como esto

Lo que te decía, @Ruben_Dario. Si está a cero, no se ha inicializado.

Y como una imagen vale más que mil palabras; partiendo de este código:

Var d As Double = 0 

If d = 0 Then
  MessageBox "El valor de d es: " + d.ToString
Else
  MessageBox "d <> 0: "
End If

Obtenemos el siguiente mensaje cuando se ejecuta:

Y si probamos a cambiar:

d = 0.000000000000001

Pues obtendremos este otro (porque no está “inicializado” o, como esperabas de .Net, “nullable”):

1 Like

Gracias a ambos por vuestras respuestas. Optaré por usar las dos variables entonces. Saludos.

En este contexto (una calculadora) cero es un valor posible de la variable, así que considerar que cero significa que no se ha inicializado no es una opción correcta.

Julen

2 Likes