• Lunes 29 de Abril de 2024, 14:18

Autor Tema:  Encuentra el error  (Leído 5344 veces)

Begeo

  • Nuevo Miembro
  • *
  • Mensajes: 21
  • Nacionalidad: es
    • Ver Perfil
Encuentra el error
« en: Jueves 21 de Agosto de 2008, 16:50 »
0
Saludos.

Verán, me di cuenta de que de los errores se aprenden. Así, solemos encontrar nuestros errores a tiempo, mientras que otros más o menos graves son dejados de la mano de dios.

La idea de este tópic es, para los que no les importe postear un poco de su código, mostrar pequeños trozos de código mostrando errores que hemos encontrado, para que no sólo nosotros aprendamos, sino también los demás.

Empiezo yo con este trozo:

Código: Text
  1. Dim CartaElegida As Integer
  2. Dim VolverAEmpezar As Boolean
  3. VolverAEmpezar = True
  4. Do While VolverAEmpezar = True
  5.     CartaElegida = CStr(Rand(1, 5))
  6.  

Encuentren los errores ;3
Asi concierne al proyecto mizuki, dejando a los dos solitarios. Debe de ser algo que hay en la vista, necesitando llevar las gafas por una razon.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #1 en: Viernes 22 de Agosto de 2008, 09:34 »
0
Sin ejecutarlo, te digo que

1) Te falta el LOOP al final del bucle

Código: Text
  1.  
  2. Do While VolverAEmpezar = True
  3.      CartaElegida = CStr(Rand(1, 5))
  4. LOOP
  5.  
  6.  

2) El bucle es infinito puesto que en su interior no se cambia la condición de salida.

3) CartaElegida es un entero y le asignas un valor String en

Código: Text
  1. CartaElegida = CStr(Rand(1, 5))
  2.  

Begeo

  • Nuevo Miembro
  • *
  • Mensajes: 21
  • Nacionalidad: es
    • Ver Perfil
Re: Encuentra el error
« Respuesta #2 en: Viernes 22 de Agosto de 2008, 17:51 »
0
Cita de: "m0skit0"
Sin ejecutarlo, te digo que

1) Te falta el LOOP al final del bucle

Código: Text
  1.  
  2. Do While VolverAEmpezar = True
  3.      CartaElegida = CStr(Rand(1, 5))
  4. LOOP
  5.  
  6.  

2) El bucle es infinito puesto que en su interior no se cambia la condición de salida.

3) CartaElegida es un entero y le asignas un valor String en

Código: Text
  1. CartaElegida = CStr(Rand(1, 5))
  2.  
Sobre lo del loop, no lo puse entero, ya que si lo ponia entero tenía también que poner el resto de la función, y eso no es "un pedazito," es un "cacho trozo".  ^_^ Lo que quería era que vieran el error de CStr().

Te invito a que pongas tu una pieza de código erróneo. ^^
Asi concierne al proyecto mizuki, dejando a los dos solitarios. Debe de ser algo que hay en la vista, necesitando llevar las gafas por una razon.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #3 en: Sábado 23 de Agosto de 2008, 02:59 »
0
Ah, bueno, entonces acerté de todas formas  :devil:  :ph34r:

Venga, uno un pelín más difícil:

modFunciones.bas:

Código: Text
  1.  
  2. Private Function Factorial(X as Integer) As Integer
  3.       Factorial = Factorial(X-1)
  4. End Function
  5.  
  6.  

modPrincipal.bas

Código: Text
  1.  
  2. Private Sub Principal()
  3.      Dim N As Variant
  4.  
  5.      N = Factorial(5)
  6.      Debug.Print N
  7. End Sub
  8.  
  9.  

Bueno, hay 3 errores. 2 de lógica y uno de metodología. A ver quién da.  :comp:

Begeo

  • Nuevo Miembro
  • *
  • Mensajes: 21
  • Nacionalidad: es
    • Ver Perfil
Re: Encuentra el error
« Respuesta #4 en: Sábado 23 de Agosto de 2008, 11:53 »
0
Creo que veo dos errores:

El primero es que no veo que se le introduzca ningún valor a X nunca - igual me equivoco.

El segundo es que Factorial, al ser una función privada, no podría llamarse fuera de modFunciones.bas, así que al llamarlo desde modPrincipal.bas no se debería de poder usar.

Creo que veo otro más, ¿Que para llamar una función externa no hay que usar "modulo.funcion(datosaqui)"?
Asi concierne al proyecto mizuki, dejando a los dos solitarios. Debe de ser algo que hay en la vista, necesitando llevar las gafas por una razon.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #5 en: Domingo 24 de Agosto de 2008, 01:03 »
0
Cita de: "Begeo"
no veo que se le introduzca ningún valor a X nunca

Sí se introduce valor a X (supongo que te refieres a Factorial(X)).

Código: Text
  1.  
  2. N = Factorial(5)
  3.  
  4.  

Cita de: "Begeo"
Factorial, al ser una función privada, no podría llamarse fuera de modFunciones.bas

Sí señor.

Cita de: "Begeo"
hay que usar "modulo.funcion(datosaqui)"

Generalmente no hace falta.

Con lo que quedan 2 errores.  :mellow:

Begeo

  • Nuevo Miembro
  • *
  • Mensajes: 21
  • Nacionalidad: es
    • Ver Perfil
Re: Encuentra el error
« Respuesta #6 en: Domingo 24 de Agosto de 2008, 12:07 »
0
¿Que factorial se llame a sí mismo no sería otro error?  :huh:
Asi concierne al proyecto mizuki, dejando a los dos solitarios. Debe de ser algo que hay en la vista, necesitando llevar las gafas por una razon.

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Encuentra el error
« Respuesta #7 en: Domingo 24 de Agosto de 2008, 15:18 »
0
Cita de: "Begeo"
¿Que factorial se llame a sí mismo no sería otro error?  :huh:
No, a eso se le llama Recursividad
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #8 en: Domingo 24 de Agosto de 2008, 15:54 »
0
Como apunta Mollense, es recursividad. De hecho hay funciones que de forma recursiva se consiguen mejores resultados, como algoritmos de árboles y demás estructuras de datos. Está interesante, échale un vistazo al tema. Te hace ver las cosas de otra manera  :D

Y para aquellos que estén interesados en otras metodologías de programación, me permito indicarles que echen un vistazo a la programación funcional. Yo adoro LISP (aúpa emacs!).  :good:

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #9 en: Jueves 11 de Septiembre de 2008, 20:09 »
0
Echale un vistazo a este codigo:

Modulo1. bas

Código: Text
  1. Public Acum As Integer
  2.  
  3.  
  4. Function Factorial(X As Integer) As Integer
  5.  
  6. 'El factorial de cero es 1
  7. 'Esta es la CONDICION de SALIDA
  8. If X - 1 = 0 Then Exit Function
  9.  
  10.  
  11. If Acum = 0 Then Acum = 1
  12. Acum = X * Acum
  13.  
  14. Factorial = Factorial(X - 1)
  15. Factorial = Acum
  16.  
  17. End Function
  18.  
  19.  


y en el form_load
coloca esto


Código: Text
  1. Private Sub Form_Load()
  2. Dim N As Integer
  3.  
  4. N = Factorial(6)
  5. Print N
  6.  
  7. End Sub
  8.  
  9.  


Y lo correspondiente a tu problema:

1) Como anoto Begeo, Private en un modulo
2) Esta funcion se va al infinito, no hay una condicion de salida para la recursividad (Error de desbordamiento, la funcion se va al infinito negativo)
3) Esta funcion es el procedimiento Factorial de matematicas, pues no hace nada , no multiplica nada (error de metodologia)


Nota:
Hagamos problemas simples ( de esos cotidianos, no los rebuscados!!) , acaso esta seccion del foro no se llama:  Visual Basic para principiantes


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #10 en: Viernes 12 de Septiembre de 2008, 14:31 »
0
Efectivamente, faltaba la condición de salida, pero si hay una solución simple, ¿para qué queremos una complicada?  :P

Código: Visual Basic
  1.  
  2. Function Factorial(X As Integer) As Integer
  3.     'El factorial de cero es 1
  4.     'Esta es la CONDICION de SALIDA
  5.     If X = 1 Then
  6.         Factorial = 1
  7.     Else
  8.         Factorial = X * Factorial(X - 1)
  9.     End If
  10. End Function
  11.  
  12.  

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #11 en: Viernes 12 de Septiembre de 2008, 23:07 »
0
Bueno, siguiendo con los errores, te tengo uno


imagina que se quiere hacer una funcion que arroje la secuencia de la siguiente sumatoria

1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + ...     ... + 1/n

se tiene el siguiente codigo:

Código: Text
  1. Function Secuencia(Nro_Iterac As Integer) As Double
  2.  
  3. If Nro_Iterac = 1 Then
  4.     Secuencia = 1
  5. Else
  6.     Secuencia =
  7. End If
  8.  
  9.  
  10.  
  11. End Function
  12.  
  13.  


Puedes decirme cual es la parte del codigo que hace falta para originar esta secuencia, evidentemente, este es el Error.


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Encuentra el error
« Respuesta #12 en: Sábado 13 de Septiembre de 2008, 09:29 »
0
Se habla de resolucion de problemas ?
Optimizacion de codigo ?
Deteccion de errores de programacion ?
Deteccion de errores de logica ?

<Code>------------------------------
Function Secuencia(Nro_Iterac As Integer) As Double
 
If Nro_Iterac = 1 Then
    Secuencia = 1
Else
    Secuencia =    '<--------------- Aqui hay un error :P
End If
 
End Function
</Code>---------------------------

Código: Visual Basic
  1. Function Secuencia(Nro_Iterac As Integer) As Double
  2. Dim Current As Integer, ret As Double
  3.  
  4.     If Nro_Iterac = 1 Then
  5.         Secuencia = 1
  6.     Else
  7.         Do
  8.             Current = Current + 1
  9.             ret = ret + (1 / Current)
  10.             DoEvents
  11.         Loop While Current < Nro_Iterac
  12.        
  13.         Secuencia = ret
  14.     End If
  15.  
  16. End Function
  17.  

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Encuentra el error
« Respuesta #13 en: Lunes 15 de Septiembre de 2008, 09:46 »
0
Bueno, lo del error, supongo que quería que rellenaramos lo que faltaba. Un poco de recursividad por favor  :P

Código: Visual Basic
  1.  
  2. Function Secuencia(Nro_Iterac As Integer) As Double
  3.  
  4.      If Nro_Iterac = 1 Then
  5.           Secuencia = 1
  6.      Else
  7.           Secuencia = (1/Nro_Iterac) + Secuencia(Nro_Iterac - 1)
  8.      End If
  9.  
  10. End Function
  11.  
  12.  

Más limpio y más sencillo imposible. Un saludo y probad la programación funcional, programar sin variables, sólo funciones.

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #14 en: Lunes 15 de Septiembre de 2008, 16:48 »
0
Citar
Más limpio y más sencillo imposible

Asi es Moskito, Saludos a todos  :)


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #15 en: Jueves 18 de Septiembre de 2008, 23:31 »
0
Seguimos con encuentra el error
Esta vez, dime la justificación del error, es mas... sin ejecutarolo puedes saber donde esta??

Aqui va (el siguiente codigo tiene un error):


Código: Text
  1. Function Suma(ParamArray Vector())
  2.     Dim X As Integer
  3.     Dim Y As Integer
  4.  
  5.     For Each X In Vector
  6.         Y = Y + X
  7.     Next X
  8.  
  9.     Suma = Y
  10.  
  11.    
  12. End Function
  13.  
  14.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Encuentra el error
« Respuesta #16 en: Viernes 19 de Septiembre de 2008, 06:42 »
0
El tipo de dato de X y Y,  debe ser igual al tipo de dato del arreglo (que es variant), para poder usarlo con For Each

o usarlo de la siguiente manera

Código: Visual Basic
  1.  
  2. Function Suma(ParamArray Vector()) As Double
  3.     Dim X As Integer
  4.     For X = 0 To UBound(Vector)
  5.         Suma = Suma + Vector(X)
  6.     Next X
  7. End Function
  8.  
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #17 en: Viernes 19 de Septiembre de 2008, 15:49 »
0
Bueno... era muy sencillo el problema, lo que queria saber era la justificación.  ^_^  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Encuentra el error
« Respuesta #18 en: Sábado 20 de Septiembre de 2008, 04:19 »
0
No entiendo la pregunta? :P


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Encuentra el error
« Respuesta #19 en: Lunes 22 de Septiembre de 2008, 17:13 »
0
Citar
Habia dicho:
Seguimos con encuentra el error
Esta vez, dime la justificación del error,

Bueno, el objetico era decir la justificación del por que el error, por que Visual Basic consideraba esto un error? , argumenta, justifica por que el error (se entiende la pregunta?)


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Encuentra el error
« Respuesta #20 en: Miércoles 24 de Septiembre de 2008, 09:14 »
0
El problema reside en que la 'X' es una variable, además es un integer, su valor es limitado, y lo que se espera es un elemento de referencia, en for each 'elemento', dicho elemento no es un valor sino una referencia, un puntero a la dirección de memoria,(el integer, tampoco tiene alcance para referenciar dicho puntero), esto es así, por que no sólo pueden ser alojados variables si no objetos, por ejemplo textbox, formularios, etc... y en el caso de las matrices si el grupo tiene elementos apunta al primer elemento. en el caso concreto usando paramarray podría perfectamente contener un integer, un textbox, una matriz de cadenas  un timer,etc... si intentas forzarlo verás que te saltará un error tal que 'No coinciden los tipos', por ejemplo al intentar forzarlo de esta manera:

Código: Visual Basic
  1.  
  2. Function Suma(ParamArray vector())
  3.     Dim X As Integer
  4.     Dim Y As Integer
  5.  
  6.     For Each v In vector   ' fíjate que v si es una variant y referencia perfectamente al elemento del grupo vector.
  7.        Y =  Y + cint(v)      ' aquí te marcará error diciendo que no coinciden los tipos.
  8.     Next v
  9.     Suma = Y
  10. End Function
  11.  
  12.  

puedes darte cuenta de su posición en memoria, para ver que por lo menos se necesita un long...

Código: Visual Basic
  1.  
  2. Function Suma(ParamArray vector())
  3.     Dim X As Integer
  4.     Dim Y As Integer
  5.  
  6.     For Each v In vector  
  7.        msgbox varptr(v)    & "    Esta es la posición de memoria donde se encuentra el elemento 'vº' del vector... "
  8.        stop   ' cuando pare aquí, lee esto y pulsa 'F5' para probar lo que comento en la siguiente línea
  9.        Y =  Y + varptr(v)      ' ahora te dará un desbordamiento, ya que un valor menor puede forzarse en una variable mayor, pero no al revés en vb6 sin convertir datos
  10.     Next v
  11.     Suma = Y
  12. End Function
  13.  
  14.  
  15.  

y para que lo veas más claro, copia y ejecuta este código paso a paso 'F8'
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Dim v()
  4.     Dim t As Timer
  5.     Dim p As PictureBox
  6.     Dim f() As Form
  7.    
  8.     ReDim f(0 To 1)
  9.     ReDim v(0 To 9)
  10.    
  11.     stop  ' nota como se va a tragar todo esto, un dato inmediato, un doble, un picturebox, un string, un timer, varios forms.... pulsa F8 para continuar.
  12.     v(0) = 3
  13.     v(1) = CDbl(3)
  14.     Set v(2) = p
  15.     v(3) = "Hola"
  16.     v(4) = 3
  17.     Set v(5) = t
  18.     Set f(0) = Form1:  Set f(1) = New Form1
  19.     Set v(6) = f(1)
  20.     set v(7)=f(0)
  21.     stop  ' nota que la siguiente línea dará error, deberás anteponerle SET (como ves en los casos anteriores) ya que su valor no es un tipo de datos genérico sino un objeto.
  22.     v(8)=v(6)
  23.     let v(9)=43
  24.     Call Suma(v)
  25. End Sub
  26.  
  27.  
  28.  
  29. Function Suma(ParamArray vector())
  30.     Dim Y As Double
  31.     Dim t As Variant
  32.        
  33.     For Each v In vector
  34.         MsgBox VarType(v)
  35.         stop ' te ha dado el valor 8204  que son 8192= vbArray + 12 = vbVariant (array de variant), pulsa f8 para continuar...
  36.         t = v
  37.        MsgBox "La dirección de memoria de 't' es: " & VarPtr(t) & " y la de 'v' es: " & VarPtr(v)
  38.        MsgBox UBound(vector())
  39.     Next v
  40.     Suma = Y
  41. End Function
  42.  
  43.  
«Ma non troppo»
----> ModoVacaciones = False<----