Página 1 de 1

Problemas de recursividad

Publicado: 15 Feb 2016, 18:43
por rovic
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

Re: Problemas de recursividad

Publicado: 15 Feb 2016, 21:31
por Chefito
Pon el código y te podremos ayudar :smt024 .

Re: Problemas de recursividad

Publicado: 15 Feb 2016, 22:55
por rovic
Ya yo le he puesto en el mensaje de inicio, gracias por la información.

Re: Problemas de recursividad

Publicado: 16 Feb 2016, 21:36
por Chefito
Exactamente que es lo que quieres hacer? Porque no se yo si lo adecuado seria con recursividad :smt012 . Explica lo que pretendes y el resultado o resultados que deberia dar.

Saludos.

Re: Problemas de recursividad

Publicado: 16 Feb 2016, 21:44
por rovic
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

Publicado: 17 Feb 2016, 16:49
por Dany
Hola.

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 :smt027

Re: Problemas de recursividad

Publicado: 17 Feb 2016, 19:23
por rovic
Gracias Dany

Re: Problemas de recursividad

Publicado: 19 Feb 2016, 21:41
por Chefito
Perdona, la verdad es que casi ni miré el código :smt005 . Viéndolo un poco por encima, se sabe perfectamente lo que quieres hacer....o simplemente viendo el nombre de la función :smt003 .
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
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 :smt023 :smt024 .

Saludos.

Re: Problemas de recursividad

Publicado: 24 Feb 2016, 16:25
por rovic
Muchas gracias y valida la propuesta. Y sobre el problema con la recursividad pudiste ver algo?