Página 1 de 1

problemas con variables

Publicado: 09 Jun 2010, 07:54
por iamchavo
Despues de mucho tiempo vuelvo al foro :P jajaja
para una pregunta que espero no sea tan obvia la respuesta :(

lo que tengo que hacer es que en cada vuelta que hace , habra el link que le sigue, con un amigo intentamos de mil formas y es error tras error :P

el problemas esta aca por lo visto $Link & $t

lo que queria hacer con esa parte era que cuando da una vuelta y( $t valga 1 ) , ($Link sea $Link1 ) entonces se abra la pagina www.google.com

Código: Seleccionar todo

#include <IE.au3>

$r= 3

	for $t=1 to $r

While 1

$Link1="www.google.com"
$Link2="www.facebook.com"
$Link3="www.youtube.com"

	$oIE = _IECreate($Link & $t,1,1)
_IeLoadWait($oIE)

Wend

next

capaz sea por la hora que mi cerebro no carbura :P

nos vemos gente :)

Re: problemas con variables

Publicado: 09 Jun 2010, 12:38
por Ximorro
A ver, en principio no se pueden manipular así las variables (realmente sí se puede, pero en realidad tampoco es lo que quieres)
Cuando concatenas algo a una variable, ¡no lo añades al nombre, lo añades al contenido!
Si por ejemplo mi variable $a = "Hola", y hago $b = $a & "1", lo que obtengo en $b no es $a1, sino "Hola1".

Sí se pueden construir variables dinámicamente como intentas, pero la verdad, es una manera muy poco convencional, y en este caso hay otros métodos mucho más apropiados, por ejemplo el uso de matrices. Mira cómo se haría con matrices. Más o menos es lo que quieres, puedes decir con un número que página quieres, sólo hay que tener en cuenta que el primer elemento en una matriz es el 0 (CERO), si empiezas a contar desde 1 te estás dejando el primero...
Fíjate qué sencillo queda el código, por cierto, he eliminado el While, ¡si no estará abriendo ventanas indefinidamente! Además la asignación de las url la hago fuera del bucle, no hace falta volver a asignar lo mismo en cada vuelta.

Código: Seleccionar todo

#include <IE.au3>

Global $r = 3
Global $enlaces[$r] ;Aquí digo que enlaces va a contener hasta 3 valores (o los que ponga en $r)
$enlaces[0] = "www.google.com"
$enlaces[1]= "www.facebook.com"
$enlaces[2]= "www.youtube.com"

For $t = 0 To $r-1
	$oIE = _IECreate($enlaces[$t],1,1)
	_IeLoadWait($oIE)
Next
Además, al inciar la matriz, si se saben todos los valores desde el principio (como en este caso), esas 4 líneas:

Código: Seleccionar todo

Global $enlaces[$r]
$enlaces[0] = "www.google.com"
$enlaces[1]= "www.facebook.com"
$enlaces[2]= "www.youtube.com"
se pueden poner en una así:

Código: Seleccionar todo

Global $enlaces[$r] = ["www.google.com", "www.facebook.com", "www.youtube.com"]
Con lo que queda todo en 5 líneas de código, ¡no hace falta complicarse la vida! :smt002

Re: problemas con variables

Publicado: 09 Jun 2010, 13:45
por Jonny
Hola

Ya que lo dices
¿como se construyen variables dinámicamente en autoit?
No es que sea algo frecuente, pero alguna vez me he encontrado con la necesidad de hacerlo (no se me ha ocurrido otra forma de resolver un problema) y no he sabido como hacerlo. Ahora ya, más que nada por curiosidad...

Salu2!

Re: problemas con variables

Publicado: 10 Jun 2010, 11:13
por Ximorro
NOTA: si estais empezando con AutoIt esta información hará que os estalle la cabeza. Usando estas técnicas es fácil cometer errores muy difíciles de detectar. ¡Mejor usa matrices! :smt003

Desde luego es una necesidad muy peculiar, y algo que yo evitaría porque efectivamente puede ser muy fácil cometer errores, pues el chequeador de sintaxis no puede ver cómo estás manipulando esas variables.
Cuando hay que crear variables dinámicamente (por ejemplo para almacenar un grupo de preferencias, que a lo mejor es variable) recomiendo usar matrices, son como variables con números, en vez de $variable1 y $variable2 pues usas $variable[1] y $variable[2].

Dicho esto te comento como se puede hacer. Para crear una variable al vuelo se hace con Assign:
Assign("mi_variable", "Soy un autoIter")
Esto es equivalente a
$mi_variable = "Soy un autoIter"
con la peculiaridad de que como en la función le pasas una cadena de caracteres, eso puede ser una variable, con lo que puede no saberse el nombre de la variable en tiempo de diseño, sino que se puede crear en ejecución.
Assign tiene un parámetro para forzar creación de variable (por defecto), darle ámbito global, local, etc..

A partir de ahí se puede usar la variable normalmente, aunque los chequeadores de sintaxis se pueden quejar si ven que la usas... porque no saben que ha sido declarada.
Normalmente la manera de acceder a ella es con la función Eval, que devuelve el valor de una variable cuyo nombre está en un string, en realidad lo normal es que sea necesario pues tendrás el nombre de la variable en otra variable... y puede que no sepas qué nombre es ese...

Código: Seleccionar todo

$nomVar = "mi_variable" ;Este es el nombre de la variable, que podría estar calculado por código, preguntado al usuario, etc...
Assign($nomVar, "Soy un autoIter", 0)
$cadena = "¡Hola! " & Eval($nomVar)
Piensa que $nomVar podría ser preguntado al usuario o calcularlo en tiempo de ejecución, con lo que realmente escribiendo el programa no sabríamos cómo se llama la variable y no la podemos usar directamente. Yo le he puesto directamente "mi_variable" por simplificar.

Eso también se puede usar para poner índices, tal como quería iamchavo, ¡pero sigo recomendando matrices!. La manera "fea" de hacer aquéllo es esta:

Código: Seleccionar todo

$url1 = "uno"
$url2 = "dos"
$url3 = "tres"
For $i = 1 To 3
	MsgBox(0, "", Eval("url" & $i))
Next
En vez de abrir páginas web muestro los valores , este código es para que sea más fácil probarlo pero hacer lo de arriba es trivial modificando esto.

Cuando se crean variables dinámicamente otra función útil es IsDeclared, que te dice si la variable existe (le pasas un string con el nombre de la variable), cosa que no es tontería porque como las creas al vuelo es fácil que tengas que comprobar las variables cuando vas a usarlas, porque si no existen te darán errores en ejecución...

Re: problemas con variables

Publicado: 10 Jun 2010, 13:30
por Jonny
Hola

Vaya... es cuanto menos, interesante. Por lo menos, aprenderlo que nunca está demás ¿no?.

La verdad es que si no se domina muy bien el lenguaje esto puede ser una pesadilla, y aún dominándolo hay muchas maneras de ebitarlo. Yo solo lo necesité (o creía necesitarlo) hace mucho tiempo, con una aplicación tipo agenda que me pidieron y desarrollé en mis inicios en AutoIt.

El problema era, que tal como querían el programa, este tenía que manejar mucha información que desconocía a la hora de desarrollarlo.
Tenía que poderse crear bases de datos (que en realidad eran archivos de texto), y poder crear los campos que se quisieran para almacenar información: Por ejemplo, una bd de películas, donde se pudiera almacenar título, fecha de estreno, descripción... cualquier cosa que se le ocurriera al usuario, y menudo taco para hacer aquello...

Por supuesto, ahora seguro que tanto aquel problema que creía que la única solución era crear así las variables, y todo el programa en sí, lo haría de otra forma muy distinta, sin necesitar esto. Sobre todo, porque lo haría con bases de datos de verdad (que por aquel entonces aún no sabía manejar con AutoIt).

Salu2!

Re: problemas con variables

Publicado: 10 Jun 2010, 16:49
por arkcrew
Esto tiene varias salidas, tambien puedes utilizar cadenas de este tipo, yo son las que más utilizo

aqui tienes un ejemplo explicado, espero qeu te ayude!!

Código: Seleccionar todo

#cs
Ejemplo 1: un array de un unico valor
Estructura:
Dim + nombre de la variable + numero de valores entre corchetes + = + lista de valores separadas por coma y entre corchetes
#ce
Dim $lista[5] = [1,2,3,4,5]

For $a = 0 to 4 step 1
	msgbox(0,"Lista","El numero de la lista obtenido es el :"&$lista[$a])
next


#cs
Ejemplo 2: array con dos valores en cada paquete
Estructura:
Dim + nombre de la variable + numero de paquetes de datos entre corchetes + numero de alores en cada paquete entre corchetes + lista de valores separados por coma
#ce

Dim $lista2[4][2] = [ ["Numero",1],["Numero",2],["Numero",3],["Numero",4] ]

For $a = 0 to 3 step 1
	MsgBox(0,"Numeros",$lista2[$a][0]&" - "&$lista2[$a][1])
	
;Aclaración, en este código, monto un msgbox con el valor número, que es el correspondiente al 0 ya que es el que defini primero en cada corchete
;si estuviera el segundo valdría 1, siempre hay que tenber en cuenta que empezamos a contar por el 0
;asi, como se ve, tengo 4 valores, pero pongo hasta un 3,ya que el for empieza a contar desde 0
next

Re: problemas con variables

Publicado: 11 Jun 2010, 08:13
por Ximorro
Efectivamente Jonny en el caso que comentas lo más adecuado es usar bases de datos. Para cosas así pero más sencillas lo puedes montar a base de arrays, y cargar/guardar los datos en archivos de texto al principio y final de programa. Pero cuando la cosa empieza a ser de más envergadura es mucho mejor pasarse a las BD.

Las matrices son algo básico, y en realidad me parece que en AutoIt se han quedado cortos con las estructuras, me habría gustado tener algo más. Además pasan cosas como que una matriz multidimensional (como la que os muestra arckrew en el segundo ejemplo) se trata de forma bastante diferente a una matriz de matrices, lo que alguna vez me ha causado algún problema.

Pero no hay otra cosa, y desde luego sigue siendo una estructura básica que se usa muy a menudo. Desde luego ¡mejor matrices que crear variables con Assign! ;-)

(Haber sí hay otras cosas fuera de AutoIt, por ejemplo el objeto Scripting.Dictionary de Windows, pero se echan de menos otras estructuras también muy comunes, como pilas, listas, colas, o al menos los mecanismos para crearlas. Se pueden simular con matrices, pero las prestaciones son entonces bastante diferentes)

Re: problemas con variables

Publicado: 29 Abr 2014, 01:32
por erm3nda
Muy interesante.

[quote="Ximorro"]Efectivamente Jonny en el caso que comentas lo más adecuado es usar bases de datos. Para cosas así pero más sencillas lo puedes montar a base de arrays, y cargar/guardar los datos en archivos de texto al principio y final de programa. Pero cuando la cosa empieza a ser de más envergadura es mucho mejor pasarse a las BD.

Yo para el caso concreto de cargar url's he utilizado alguna vez un fichero de texto externo. Me sirve para varias cosas; poder editar sólo las urls (no codigo) con cualquier editor de texto, puedo crear ese fichero con otras tecnologías como PHP, me permite editar url's en el caso de compilar el script a exe.

En el caso de poner una db, con sqlite3 va que chuta y así no necesitas un servidor. Ya no se puede editar con un editor de textos pero bueno.
Y lo de usar una db, SQL o MySQL eso ya es si tienes mogollón de registros o actividad en dicha app.

Re: problemas con variables

Publicado: 09 May 2014, 09:20
por chekok
Existe un término medio entre las bases de datos y un txt plano, siempre puedes usar un .csv que puedes estructurar y editar desde excel fácilmente o también te puedes meter con .xml (que es muy usado para transferencia de datos entre plataformas para evitar problemas con los motores de bases de datos) y puedes estructurar para que la información pueda ser usada sin problema desde distintos lenguajes (autoit, php, java, python, ...) Y al fin y al cabo puedes seguir editándolo con el bloc de notas :smt005