Problemas de recursividad
Problemas de recursividad
Cuando hago una función recursiva a partir de la segunda llamada no funciona: Return SetError. Al menos no devuelve la función SetError el valor del argumento pasado en el tercer parámetro. Al parecer el problema está en la función Return.
;#Include <FF.au3>
#Region Include
#include-once
#include <StringConstants.au3>
#EndRegion
$resultAna = AnalizarVersionProgram("6.5.310","6.5.10")
Exit MsgBox(64,"Información",$resultAna)
Func AnalizarVersionProgram($version, $versionText)
If Not $versionText Then Return SetError(1,0,"No se ha especificado ninguna versión para la comparación.")
$resultAnaExp = StringRegExp($versionText,"^\.|[^0-9\.]|.\D\.|\.$")
If @error Then
Return SetError(2,0,"Información sobre el error: " & @extended)
EndIf
If $resultAnaExp Then Return SetError(3,0,"La versión especificada no cumple con la estrutura consebida para la comparación.")
$posPtoVersion = StringInStr($version,".")
$posPtoVersionText = StringInStr($versionText,".")
$result = ($posPtoVersion?Int(StringLeft($version,$posPtoVersion-1)):Int($version)) _
- ($posPtoVersionText?Int(StringLeft($versionText,$posPtoVersionText-1)):Int($versionText))
Select
Case $result > 0
Return SetError(0,2,"<")
Case $result < 0
Return SetError(0,2,">")
Case $result = 0
If $posPtoVersionText And Not $posPtoVersion Then Return SetError(0,3,">=")
If $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,4,"<")
If Not $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,5,"=")
AnalizarVersionProgram(StringMid($version,$posPtoVersion + 1),StringMid($versionText,$posPtoVersionText + 1))
EndSelect
EndFunc
;#Include <FF.au3>
#Region Include
#include-once
#include <StringConstants.au3>
#EndRegion
$resultAna = AnalizarVersionProgram("6.5.310","6.5.10")
Exit MsgBox(64,"Información",$resultAna)
Func AnalizarVersionProgram($version, $versionText)
If Not $versionText Then Return SetError(1,0,"No se ha especificado ninguna versión para la comparación.")
$resultAnaExp = StringRegExp($versionText,"^\.|[^0-9\.]|.\D\.|\.$")
If @error Then
Return SetError(2,0,"Información sobre el error: " & @extended)
EndIf
If $resultAnaExp Then Return SetError(3,0,"La versión especificada no cumple con la estrutura consebida para la comparación.")
$posPtoVersion = StringInStr($version,".")
$posPtoVersionText = StringInStr($versionText,".")
$result = ($posPtoVersion?Int(StringLeft($version,$posPtoVersion-1)):Int($version)) _
- ($posPtoVersionText?Int(StringLeft($versionText,$posPtoVersionText-1)):Int($versionText))
Select
Case $result > 0
Return SetError(0,2,"<")
Case $result < 0
Return SetError(0,2,">")
Case $result = 0
If $posPtoVersionText And Not $posPtoVersion Then Return SetError(0,3,">=")
If $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,4,"<")
If Not $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,5,"=")
AnalizarVersionProgram(StringMid($version,$posPtoVersion + 1),StringMid($versionText,$posPtoVersionText + 1))
EndSelect
EndFunc
Última edición por rovic el 15 Feb 2016, 22:52, editado 1 vez en total.
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Problemas de recursividad
Pon el código y te podremos ayudar .
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: Problemas de recursividad
Ya yo le he puesto en el mensaje de inicio, gracias por la información.
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Problemas de recursividad
Exactamente que es lo que quieres hacer? Porque no se yo si lo adecuado seria con recursividad . Explica lo que pretendes y el resultado o resultados que deberia dar.
Saludos.
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: Problemas de recursividad
Creo que existen otras maneras de lograrlo pero me parecio que habia encontrado un error con el autoit que podia ser corregido. El problema es que hay veces que las opciones de elegir son mas limitadas y quizas en con otro codigo no tendria otras opciones. Gracias por la atencion. Pero revisastes el codigo?
Re: Problemas de recursividad
Hola.
Saludos
Código: Seleccionar todo
;#Include <FF.au3>
#Region Include
#include-once
#include <StringConstants.au3>
#EndRegion Include
$resultAna = AnalizarVersionProgram("6.5.310", "6.5.310")
Exit MsgBox(64, "Información", $resultAna)
Func AnalizarVersionProgram($version, $versionText)
If Not $versionText Then Return SetError(1, 0, "No se ha especificado ninguna versión para la comparación.")
$resultAnaExp = StringRegExp($versionText, "^\.|[^0-9\.]|.\D\.|\.$")
If @error Then
Return SetError(2, 0, "Información sobre el error: " & @extended)
EndIf
If $resultAnaExp Then Return SetError(3, 0, "La versión especificada no cumple con la estrutura consebida para la comparación.")
$posPtoVersion = StringInStr($version, ".")
$posPtoVersionText = StringInStr($versionText, ".")
$result = ($posPtoVersion ? Int(StringLeft($version, $posPtoVersion - 1)) : Int($version)) _
- ($posPtoVersionText ? Int(StringLeft($versionText, $posPtoVersionText - 1)) : Int($versionText))
Select
Case $result > 0
Return SetError(0, 2, "<")
Case $result < 0
Return SetError(0, 2, ">")
Case $result = 0
If $posPtoVersionText And Not $posPtoVersion Then Return SetError(0, 3, ">=")
If $posPtoVersion And Not $posPtoVersionText Then Return SetError(0, 4, "<")
If Not $posPtoVersion And Not $posPtoVersionText Then Return SetError(0, 5, "=")
Return AnalizarVersionProgram(StringMid($version, $posPtoVersion + 1), StringMid($versionText, $posPtoVersionText + 1))
EndSelect
EndFunc ;==>AnalizarVersionProgram
Saludos
- ............................................
......................................
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Problemas de recursividad
Perdona, la verdad es que casi ni miré el código . Viéndolo un poco por encima, se sabe perfectamente lo que quieres hacer....o simplemente viendo el nombre de la función .
Yo para eso no utilizaría recursividad. La recursividad se suele utilizar para otros casos con finales inciertos y difíciles de programar de forma iterativa. Pero en este caso le va muy bien una iteración.
Yo lo haría así:
Esta función está realizada siempre que tenga los mismos bloques (los mismos puntos). Si una de las versiones tiene más o menos puntos se tendría que variar un poco, pero poco .
Saludos.
Yo para eso no utilizaría recursividad. La recursividad se suele utilizar para otros casos con finales inciertos y difíciles de programar de forma iterativa. Pero en este caso le va muy bien una iteración.
Yo lo haría así:
Código: Seleccionar todo
Local $resultAna, $valor
$resultAna = AnalizarVersionProgram("6.5.310", "6.5.310")
Switch $resultAna
Case 1
$valor="mayor"
Case 0
$valor="igual"
Case -1
$valor="menor"
EndSwitch
MsgBox(0,"Resultado","La versión del primer programa es " & $valor & " que la versión del segundo programa")
Func AnalizarVersionProgram($version1, $version2)
Local $aVersion1, $aVersion2
$aVersion1=StringSplit($version1, ".")
$aVersion2=StringSplit($version2, ".")
For $n=1 to $aVersion1[0]
If Number($aVersion1[$n])>Number($aVersion2[$n]) Then
Return 1 ;mayor
ElseIf Number($aVersion1[$n])<Number($aVersion2[$n]) Then
Return -1 ;menor
EndIf
Next
Return 0 ;igual
EndFunc
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: Problemas de recursividad
Muchas gracias y valida la propuesta. Y sobre el problema con la recursividad pudiste ver algo?