Página 1 de 2

Bucle incremental y StringSplit

Publicado: 26 Abr 2011, 11:00
por dacu
Buenas, Otra vez a preguntar mas cosas.

Ahora lo que me perturva es lo siguiente:

Uso la fuccion StringSplit

Código: Seleccionar todo

$cadenatxt= "000101101001011001"
$condicion= ""
$uno= StringSplit($texto, $condi)
Con esto ya me separo cada caracter

1 0 0 1 0 .......

Bien y lo puedo monstrar asi

Código: Seleccionar todo

MsgBox(0,"",$uno[1])
Que me devolveria "0"

Bien tambien puedo hacer esto.

Código: Seleccionar todo

$sumar= 1
Msbox(0,"",$uno[$sumar])
Tambien me devolveria "0"

vale ahora donde entra mi problema es lo siguiente.

Código: Seleccionar todo

Func x0()


Select
	Case $uno[$a] = 0
		$a= $a + 1
                      Hacer algo
	Case $uno[$a] = 1
		$a= $a + 1
                     Hacer algo
	EndSelect
EndFunc
Esto lo encierro en un while o en cualquier cosa que me cree un bucle.

con esto lo que consigo es que balla comprovando cada caracter de $cadenatxt
pero me da un error que es el siguiente.
line49...... (file".....

Case $uno[$a]=0
Case ^ ERROR

Error: Array variable has incorrect number of subcripts or subcript dimension range exceeded.
Y esto solo me pasa al poner

Código: Seleccionar todo

$a= $a + 1
Si lo quito el error no me lo da.

Espero que me podais ayudar. Gracias.

Re: Bucle incremental y StringSplit

Publicado: 26 Abr 2011, 11:20
por Ximorro
Supongo que al principio cuando usas $condicion y $condi en realidad son la misma variable, tienes que poner lo mismo en los dos sitios.
Lo mismo pasa con $cadenatxt y $texto...

Lo que te está pasando en la suma es que no pones límite a la $a, piensa que la vas incrementando para recorrer el vector, pero habrá un momento en que se pasará.
Si un vector/matriz (llamémoslo $vec) tiene 20 elementos, como se empieza a contar de cero, el primer elemento es
$vec[0]
y el último
$vec[19]
Si pones más, por ejemplo $vec[20] o $vec[54] o $vec[1500] te da el error ese de rango excedido (también obtendrás un error parecido si pones un índice negativo, pues el menor posible es cero).

Lo que te pasa es que cuando tu $a vale ya el último ese lo saca, pero luego incrementas $a y el siguiente $uno[$a] se pasa de rango.

Una cosa, con StringSplit miramos desde 1 no porque el vector sea especial y empiece en 1, lo que ocurre es que por defecto StringSplit pone en la posición cero el número de elementos que ha extraído ¡y eso es justamente lo que tienes que usar para limitar la $a!.

Por cierto, en este caso no hace falta pero cuando una función no devuelve de alguna manera el número de elementos, lo puedes averiguar con la función UBound().


No lo hagas con Select (ni Switch, ni con un montón de If-ELSEIF). Utiliza un bucle que vaya recorriendo el índice dentro del rango adecuado (desde 1 hasta el valor que StringSplit te ha guardado en $uno[0]). Un bucle se adaptará al tamaño del vector (o sea, al tamaño de $cadenatxt) sin tener que retocar el código, lo que es muy cómodo.
En este caso probablemente lo más cómodo sea usar un bucle FOR-NEXT, también se puede hacer con While o con Do.
Mira eso en la ayuda e intenta hacerlo tú. Te ayudamos con las dudas así aprenderás más que si te lo hacemos directamente.

Una cosa, te conviene mirarte la ayuda básica para entender todo esto de los bucles y otras estructuras, tienes una guía sobre qué mirar para empezar con estos mecanismos básicos de programación aquí:
http://www.emesn.com/autoitforum/viewto ... f=2&t=2593

Re: Bucle incremental y StringSplit

Publicado: 26 Abr 2011, 11:43
por dacu
Ximorro, Gracias.

Joder que tonto, no sé cómo no he caído en la cuenta esa, Claro si excede la cantidad pues te tira error.
Gracias por la amplia respuesta y está perfecto, lo que me gusta es que me den una pequeña ayuda y partiendo de ahí intentar yo conseguir hacerlo.
A sí que muchas gracias y voy a ver como lo ago.

Saludos.

Re: Bucle incremental y StringSplit

Publicado: 26 Abr 2011, 12:39
por Ximorro
De nada, ya nos dirás cómo te va.

Por cierto, lo que he dicho de no usar el Switch me refería a lo de recorrer los diferentes valores de $a. Para distinguir entre cero y uno sí se puede usar, pero siendo que sólo son posibles esos valores quedaría más simple con un sencillo IF-ELSE.

Re: Bucle incremental y StringSplit

Publicado: 29 Abr 2011, 19:46
por ms999
Te pasaste Ximorro!!! me adelantaste algo que ya estaba viendo por donde iba... sabia que esto no era cosa facil y sabia que esto iba a terminar siendo para aprender sobre el contenido de los archivos y su interpretacion... tambien se que pasar a binario archivos los haria mas grandes... y en cierto caso debe ser una redundancia para programar, ya que la PC comprende en binario, pero nosotros estamos trabajando en binario pero no de una manera cercana al laneguaje de la maquina, sino todo lo contrario, como una capa... para interpretar el binario de una manera que sea efectiva, se deberia usar un lenguaje de programacion mas cercano al lenguaje de la maquina... porque con autoit siempre trabajas por encima de la capa del sistema operativo...

LENGUAJE BINARIO ----- SISTEMA OPERATIVO ------ ACA FUNCIONAN LOS PROGRAMAS CON AUTOIT

Si queremos hacer rapido esto deberiamos poder reinterpretar las cosas a nuestra menera e incorporarlas al sistema operativo... pero nos vamos de tema y esto seria un nivel 6 o 7 XDD

Bueno paso a paso ire viendo estos temas... por ahora me quedo con aprender a usar la GDI+ y aprender algo sobre los BMP y la interpretacion de archivos....

Re: Bucle incremental y StringSplit

Publicado: 03 May 2011, 11:46
por Ximorro
Pues por supuesto que habrá que estudiar en profundidad los formatos que queráis utilizar para meter vuestros datos, pues tenéis que meterlos respetando las normas de ese formato (si no no será reconocido como tal). No basta poner a cualquier archivo extensión jpg o xvid para que se convierta en imagen o video, es mucho más complicado.

Pasarlo a binario no hace el archivo más grande, el archivo ya está en binario. El problema es que estabais recodificando el binario a caracteres. Eso es lo que lo hace más grande porque un carácter ASCII ocupa un byte, ocho bits, aunque sólo uses caracteres para "0" y "1".
En binario puro un 0 ó 1 ocupa sólo un bit.

AutoIt no es la repera para manejar binario pero algo se puede hacer. Están las funciones "Binary...", un poco escasas a mi gusto, y también puedes manejar estructuras tipo C con las "DLLStruct..." Su nombre indica que están pensadas para interactuar con funciones en DLL, pero nada te impide usarlo por ejemplo... ¡para montar la cabecera de un BMP! ;-)

Aquí por ejemplo trabajo en binario directamente, y como digo en el comentario, habría agradecido algunas funciones más para manejarlo:
http://www.emesn.com/autoitforum/viewto ... 2254#p8978
Ahí para hacer búsquedas en el binario pasaba a string con BinaryToString, que sí, es una representación ASCII del binario, pero en hexadecimal, más compacta que la binaria que usábais. Pero eso lo hago porque tengo que buscar cadenas binarias. Si tenéis estructuras fijas (como la cabecera del BMP) se puede montar una DLLStruct y escribir directamente en las posiciones correctas usando los campos que se creen).


Es que habéis empezado por cosas un poco fuertes. Y no te digo ya el GDI... :smt027