TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 16 de Octubre de 2011, 18:58:56

Título: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 16 de Octubre de 2011, 18:58:56
Hola a tod@s, una vez más tengo un problema y una vez más les pido ayuda.
 Tengo un programa donde meto datos de un teclado numérico en un array, hasta ahí todo funciona perfecto, pero necesito limpiar el array y dejarlo libre para hacer una nueva lectura de teclado, he probado algunos mecanismos pero no me ha funcionado a ver si me echan una mano, gracias de ante mano
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: AngelGris en 16 de Octubre de 2011, 19:13:27
  Una forma que debería funcionar es hacer un ciclo for con la cantidad de elementos que tenga tu array y poner el caracter nulo en cada elemento. Es funciona, aunque tal vez sea poco eficaz, tal vez exista otra forma de hacerlo.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Suky en 16 de Octubre de 2011, 19:19:44
utilizar memset() es lo más eficiente en tiempos de ejecución. Revisar la ayuda del compilador para ver como se aplica.


Saludos!
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MLO__ en 17 de Octubre de 2011, 20:55:17
Hola.

Yo prefiero el for() .... la función memset() me trajo problemas con las interrupciones en el CCS ...

Saludos
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Suky en 17 de Octubre de 2011, 21:05:05
Y bueno, es CCS  :mrgreen:  Raro, porque no es más que un for pero en asm, o algo muy parecido.

Saludos
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: RICHI777 en 17 de Octubre de 2011, 21:52:13
Hola la mejor forma es como indico Suky usando el memset. Igualmente con colocar el primer elemento en 0 alcanza, ya que C lo debe interpretar como string nulo.

Código: C
  1. unsigned char MyStr[ 80 ];
  2. ...
  3.  
  4. MyStr[ 0 ] = 0;

Saludos !
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: AngelGris en 17 de Octubre de 2011, 22:06:05
 De hecho, en Hitech sí funciona con solo colocar el caracter nulo en el primer elemento del array.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 18 de Octubre de 2011, 14:17:16
Hola a todos.
He solucionado el problema que tenía para limpiar un array, de la manera que lo he hecho es como vosotros me habéis indicado, hay otras opciones que tengo que estudiar, pero por la primera que optado ha salido bien, pongo como lo he hecho:
Con un bucle for de esta manera:

Tengo un array de 4 elementos, el último elemento es un \0 que es el final del array.
Código: [Seleccionar]
Int array[4];
//con este bucle lo dejo todo a 0
For(i=0;i<4;i++){
array[i]=NULL;
}

Pero tengo un problema, resulta que al principio del programa, ese array lo grabo con los datos de un teclado que se queda grabado según pulse las teclas de esta manera:
Código: [Seleccionar]
array[i]=x; //la x es la variable del teclado
i++;

Y graba bien en cada posición del array, solo si ejecutamos el programa por primera vez.

Al tener ya cargado el array, después de aplicar el bucle for para limpiar el array y cargar todas las posiciones a 0, al intentar volver a grabar números con el teclado, el array no se carga y se queda como lo ha dejado el bucle for todo a 0.

No comprendo que puede estar fallando, ¿Por qué graba el bucle for y no graba el primer bucle que hice?. y ¿por que graba bien del teclado al iniciar el programa y luego ya no graba más?, es cómo si el programa detectara que las posiciones están llenas y no deja machacarlas.

Llevo tiempo programando o más bien "intentando" programar pero me falta mucha experiencia y conocimiento, ruego me disculpen, los único profesores que tengo son ustedes.

Espero explicarme bien les pido perdón e intentaré hacerlo mejor.
gracias
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: AngelGris en 18 de Octubre de 2011, 15:02:42
Si podés subir el programa va a ser mas fácil que podamos aportar algo.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 19 de Octubre de 2011, 00:02:29
char *p, x;
p=&array[0];
for(x=0;x<tamaño;x++) *p++=0;

PD: Los [] ocupan el doble de instrucciones mas que utilizar un puntero.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: AngelGris en 19 de Octubre de 2011, 11:23:57
No termino de entender porque podes borrarlo y volver a cargarlo. Si borrarlo es lo mismo que cargarlo sólo que con los datos en 0.

¿Estás reseteando la posición del puntero? Tal vez te está ocurriendo que dejás el puntero donde terminaste antes y por ello te queda en cualquier lado.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: RICHI777 en 19 de Octubre de 2011, 11:31:00
Hola, aunque sigo pensando que con solo colocar el primer miembro en 0 alcanza, estoy totalmente de acuerdo con este último post, casi siempre trabajar con punteros es mas eficiente que trabajar con los indices de los arrays.

Saludos !
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Suky en 19 de Octubre de 2011, 13:39:12
Hola, aunque sigo pensando que con solo colocar el primer miembro en 0 alcanza, estoy totalmente de acuerdo con este último post, casi siempre trabajar con punteros es mas eficiente que trabajar con los indices de los arrays.

Saludos !

Sip, en el foro hay un post que se vio el tema, el orden fue el siguiente:

memset
Punteros
Indices de arrays

Saludos!
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 20 de Octubre de 2011, 13:00:03
Gracias por toda la información, uno de los problemas que me he dado cuenta que tengo, es que todos estos códigos los pruebo en el simulador proteus y me estoy dando cuenta que no funciona muy bien, para pequeños códigos va bien pero para proyectos más complejos engaña mucho, estoy a la espera de comprarme un kit de desarrollo.
he pensado en el que vende mikroelectronika, ¿alguien me puede recomendar alguno diferente para estudiarlo o este que he mirado va bien?, estoy pensando hasta comprar el kit que viene con el mikroC-pro.
gracias a todos
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 21 de Octubre de 2011, 21:57:49
lo mejor es un pic, un programador con debugger y una protoboard  ;-) te lo digo porke los kits de desarrollo estan bien para algunas cosas, pero donde mas aprenderas sera al montarlo tu, al programar tu tu codigo, al fallar y al solucionarlo... Un kit de desarrollo ya esta hecho, diseñado, y tiene su codigo ya hecho.
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 21 de Octubre de 2011, 22:28:20
¿Entonces me recomiendas que yo diseñe mi propio prototipo para pruebas? o ¿busco uno ya diseñado y me hago las placas y lo monto?
¿si hago eso, funcionará el modo debugger de los ides?.
estoy un poco verde en este campo, se montar placas y diseñarlas pero no se si al fabricarme el kit de desarrollo, tendrá las mismas prestaciones con los ides que un kit de fabrica.
a ver si me pueden orientar
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 22 de Octubre de 2011, 04:22:19
lo que digo es que vayas montando las cosas segun vayas queriendo aprender, que hoy quieres aprender a encender un led y que parpadee.. pues montas eso, que mañana quieres aprender a usar el puerto serie para conectarlo con el pc, pues lo montas, que pasado quieres aprender a usar el USB pues .... Tienes la opcion facil, una protoboard que no se suelda, o buscarte una protoboard que se suelda e ir poniendole circuito...

Si te funcionan los debuggers mas o menos como el proteus pero real, le puedes poner tus breakpoins, ver las variables del pic como cambian, ejecutar funcion por funcion...
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 22 de Octubre de 2011, 05:01:35
Lo de la protoboard no me gusta nada, los cables meten mucho ruido, he tenido problemas con ellas, pero por lo demás, voy ha hacer lo que me dices e ir montándome mi propio entrenador según las necesidades.
gracias
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Suky en 22 de Octubre de 2011, 10:12:47
Generalmente si se trabaja de forma prolija el protoboard va a funcionar, y estoy con  MerLiNz, te va ayudar a crecer en conocimiento. Comienza a fallar cuando implementas comunicaciones a alta velocidad, SPI > 5 MHz, por ejemplo.

Sino te queda algo como la PICTrainer de Felixls por ejemplo, donde puedes crear los módulos según la necesidad del proyecto.

Saludos!
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 23 de Octubre de 2011, 14:08:22
yo he usado en la protoboard 48mhz sin problema alguno con una LCD. Tambien le he puesto 64Mhz pero con el reloj interno sin problema en el lcd. Tambien he usado una memoria SPI a la velocidad maxima de este, no recuerdo cuanto era pero 10mhz o algo asi, sin problemas tambien.

Para aprender no te hace falta mucha velocidad.
Cuando te quieras poner mas serio, siempre podras comprar las PCB's protoboards soldar cables, y no tendras ningun problema, yo con esto estoy haciendo un sistema con can-bus, lcd, rs232... y sin problema alguno. Una vez lo tenga completado, me pasare a hacer mi propia PCB.

http://img143.imageshack.us/img143/5733/07102011158.jpg
http://img412.imageshack.us/img412/1664/07102011159.jpg
http://img822.imageshack.us/img822/3484/14102011161k.jpg

Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 24 de Octubre de 2011, 13:47:43
Hola a todos, muchas gracias por la ayuda.

Lo de las protoboards no me gustan, cuando estudié electrónica de comunicaciones, estuve los 5 años con protoboards y les he cogido odio, se hace una maraña de cables, se desconectan, se metía ruido por los cables cercanos, etc, etc.

Para proyectos pequeños por lo menos a mí si me sirve pero para cosas más grandes no me gustan

He decidido fabricarme los módulos que vaya necesitando, modulo del pic con cristales etc..., teclado, lcd, glcd, rs232, e ir interconectando todo.

Ahora estoy con el kitcad que me parece una excelente herramienta.

Cuando tenga ya hecho algo, sigo con las preguntas sobre los arrays y eso, pero quiero probar lo que me han dicho con micros físicos y dejarme de simuladores, pero para eso tengo que pillarme un programador/debugger y hacerme las placas
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 24 de Octubre de 2011, 14:51:04
tampoco se hace tan lioso xDD

(http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Breadboard_complex.jpg/220px-Breadboard_complex.jpg)
(http://upload.wikimedia.org/wikipedia/commons/thumb/3/3f/68k_ttl.jpg/800px-68k_ttl.jpg)
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Suky en 24 de Octubre de 2011, 15:21:44
 :D :D
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MerLiNz en 24 de Octubre de 2011, 15:30:26
aunque no lo creais, lo que hay montado en la protoboard es un pc 8088 y un motorola 68000 xD
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 24 de Octubre de 2011, 15:43:15
Jajajaja, veo eso y me traen recuerdos
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: MLO__ en 24 de Octubre de 2011, 16:54:56
pffff .. me di cuenta siguiendo el cable rojo  :D :D :D :D

Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Yoshua en 24 de Octubre de 2011, 20:30:18
Gracias a dios no es una bomba ...  :D   :D  :D
Título: Re: ¿cómo puedo limpiar un array?
Publicado por: Thulsa Doom en 21 de Noviembre de 2011, 19:17:28
Hola pues quiero decir que gracias a vuestros consejo he podido limpiar el array, con memset y con for, de las dos maneras lo he logrado, tenía un problema que era que una vez limpiado no podía escribir de nuevo y me di cuenta que también tenía que poner a 0 la i,
ósea yo hacía esto.

Código: [Seleccionar]
char array[4];

array[i]=x;
i++;
al no poner la i a 0 se quedaba en 4 y cada vez que accedía al array como era superior la i al array no grababa, he puesto la i a 0 y ha funcionado perfectamente.
gracias a todos