Programación General > Visual Basic para principiantes

 problema con numero y #: numero#

(1/1)

Jimbenit:
Hola a todos los de visual basic, ya creo que me conocen  :lol:

En esta ocasion tengo un problema, se que debe ser facil pero aqui se los coloco:

Tengo un proceso que no hice yo, es el siguiente:

--- Código: Visual Basic ---For i = 1250 To 3540               Y1 = Int(150# * Cos(amplitud) * Sin((i - 1250#) * 8# * PI / 2290#) + 2650# + j)                Y2 = Int(520 / 600 * (i - 1250) + 3280)                Y3 = Int(-520 / 600 * (i - 3540) + 3280)                If Y1 > Y2 Then                    Y1 = Y2                ElseIf Y1 > Y3 Then                    Y1 = Y3                ElseIf Y1 > 3750 Then                    Y1 = 3750                End If                PSet (i, Y1), RGB(red2, Green2, blue2)        Next 
y lo quiero aislar a un SUb y lo coloco de la siguiente manera:


--- Código: Visual Basic ---Private Sub Water_Waves(Min As Integer, Max As Integer, Nro_Seccion As Integer)    Dim i As Integer        'water waves        For i = Min To Max                Y1 = Int(150# * Cos(amplitud) * Sin((i -Min#) * 8# * PI / 2290#) + 2650# + j)                Y2 = Int(520 / 600 * (i - Min) + 3280)                Y3 = Int(-520 / 600 * (i - Max) + 3280)                If Y1 > Y2 Then                    Y1 = Y2                ElseIf Y1 > Y3 Then                    Y1 = Y3                ElseIf Y1 > 3750 Then                    Y1 = 3750                End If                PSet (i, Y1), RGB(Vector_Seccion(Nro_Seccion).Red, Vector_Seccion(Nro_Seccion).Green, Vector_Seccion(Nro_Seccion).Blue)        Next   End Sub 
El error me dice que esta en el Min# de la linea 5...
La pregunta es:
¿Como debe colocarse para que el codigo sea correcto?
saludos y gracias a todos...

m0skit0:

--- Código: Visual Basic ---CDbl(Min) 
No uses caracteres de declaración de tipos (#, @, $, etc...), es una mala práctica. Son confusos y dificultan la legibilidad.

Saludos.

F_Tanori:
Ademas en este casi ni siquiera son necesarios

Para convertir a double usas la funcion que te dio m0skit0
o
simplemente declaralo como dobles


--- Código: Visual Basic ---Private Sub Water_Waves(Min As Double, Max As Double, Nro_Seccion As Integer) 
Pero la expresion es correcta sin #


--- Código: Visual Basic ---Int(150 * Cos(amplitud) * Sin((i -Min) * 8 * PI / 2290) + 2650 + j) 

y a mi parecer esto 150# resulta incoherente, pues Visual Basic ya lo reconoce como un valor numerico


Saludos

Jimbenit:
Si, correcto...
ssencillo cierto??:...  B)  Grcias...

Nebire:
No hay nada malo en usar la declaración de tipos, quizás el problema sea que si la gente no está acostumbrada a usarlos no los reconozca.

Más concretamente en los valores inmediatos numéricos es acertado hacerlo por que por defecto cualquier valor inmediato es de tipo long por tanto forzarlo a un single o double si el resultado va a contener ese tipode datos es acertado porque le ahorras a vb algunas comprobaciones de tipos.

Por otro lado, vb utiliza como acumulador 'la variable de la izquerda' en una expresión, lo que nos indica en cierto modo que algunas declaraciones pueden ser superfluas y la expresión entonces debería diseñarse en base a velocidad, esto es, el tipo de datos integer que es el más rápido para vb, por tanto los de tipo byte promocionarlos a integer y los longs si no superan el límite de un integer también promocionarlos a integer. Si se requiere más info sobre esta cuestión, basta que avises...

Tu error se da porque declaras Min como integer en el parámetro de la función pero al usarlo luego dentro de una expresión le dices que es un double, ya está declarado por tanto es una etiqueta duplicada, sólo que aquí nos indicará duplicación de etiqueta porque la declaración es explícita en tanto que utilizando el signo de tipo es implícito. si se declarara primeramente la variable con el signo implícito y luego se hiciera la declaración explícita, el error también se daría como etiqueta duplicada, como es el orden al revés se asume el error en el signo implícito, es decir en la 2ª declaración....

 El error equivalente fácil de comprender serían estas combinaciones de código:

--- Código: Visual Basic --- ' duplicación de etiqueta: 1º 'valor' se declara explícitamente como integer luego como doubledim Valor as integerdim Valor as double ' error aquí  
--- Código: Visual Basic --- ' duplicación de etiqueta: 1º 'valor' se declara implícitamente como integer luego explícitamente como doubleValor% = 20*5dim Valor as double ' error aquí  

--- Código: Visual Basic --- ' el signo de declaración no coincide con el tipo de la declaración: 1º 'valor' se declara explícitamente como double luego  implícitamente como integer . este es tu casodim Valor as doubleValor% = 20*5 ' error aquí  
--- Código: Visual Basic --- ' el signo de declaración no coincide con el tipo de la declaración: 1º 'valor' se declara implícitamente como double luego  implícitamente como integer .Valor#= 45 Valor% = 20*5  ' error aquí  
p.d.: para recrear esas ondas, no crees que sería mejor utlizar circle en vez de pset ?...
Además de más rápido te permitiría más flexibilidad, con currentx y currenty desplazarías la 'onda' y con el aspecto del círculo definirías la elipse, con el inico y fin del arco definirías los grados del arco... resumiendo, podrías además, hacer sobre el bucle  que la onda fuera variando a cada arco, mascorta, más larga, mas alta mas baja, no de 180º y no en línea recta... en vez de dibujar una sinusoide. Claro que depende de para qué lo quieras, pero sería mejer usar circle de todas maneras.

Navegación

[0] Índice de Mensajes

Ir a la versión completa