Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/11/2014 #1


Punteros con PIC16 en PIC C Compiler
Buenas tardes. Quisiera saber cómo puedo guardar un valor usando punteros u otra función y que ese valor se quede fijo y no cambie hasta que se repita el bucle y lea todas las funciones.
Código:
#include <stdlib.h>
#use standard_io (a)
static char k;
char k1;
char k2;
char func;
char func2;
char *x;
char *y;
char x1;
char y1;
int save(k ){
x=&k;
x1=*x;
return(x1);
}
void main (){

lcd_init();
kbd_init();
port_b_pullups(TRUE);

while(true){
k=kbd_getc();
k1=kbd_getc();
if(k!=0){

printf(lcd_putc,"\f%c",k);

x=&k; //aqui guardo k, pero se modifica y obtiene el valor de &quot;A&quot; q esta mas abajo
x1=*x;


if(k=='A'){
printf(lcd_putc,"\f%u",x1);



}
}
}
}
08/11/2014 #2

Avatar de TRILO-BYTE

aver deja ver si entendi

quieres guardar en un puntero lo que escribas en el

digamos:

char *cadena;

y que en mi puntero cadena se guarde 123#
y una vez guardado ver lo que escribi dentro de mi puntero

pues seria leer hasta que llegue a NULL no se si CCS reconoce el NULL pero le puse caracter nulo aunque no creo que funcione pues debe el bucle while encontrar dicho caracter asi que prueba con NULL si no cada vez que guardes en el puntero el puntero siguiente le metes un caracter nulo '\0'
con un while

while(cadena[i]!='\0') //while(cadena[i]!=NULL)
{
cadena[i];
i++;
}

con esta rutina puedes sacar lo que se va metiendo dentro de tu puntero hasta llegar a caracter nulo prueba con NULL que a diferencia de un caracter nulo este es que no hay nada en la RAM
08/11/2014 #3

Avatar de JoaquinFerrero

Para guardar información en la memoria libre, primero hay que reservarla.

Tradicionalmente, eso se hace con funciones como malloc/free (en caso de que las bibliotecas del compilador las soporten).

Lo más sencillo es tener variables array con un valor determinado al principio, con espacio suficiente para guardar la información.

Por ejemplo, si vamos a guardar 40 cadenas de caracteres de 10 caracteres cada una, podemos hacer así:

char *bufer[400]; /* un array de 400 posiciones */

char bufer[40][10]; /* matriz bidimensional de caracteres */
08/11/2014 #4

Avatar de TRILO-BYTE

pero hacer esto:

char *bufer[400];

no es lo mismo que

char bufer[400];

ya que si usamos un puntero lo que hace es meter en la RAM sin reservar previamente un tamaño determinado ¿que cuando hacemos un array?

en CCS creo que es mejor usar un puntero que una reserva de memoria pues:
1.- CCS da busg a reservas de memoria grandes
2.- si no usamos toda la reserva desperdiciamos memoria en microcontroladores pequeños como los pic16f
08/11/2014 #5

Avatar de JoaquinFerrero

Cierto, se me escapó el '*'. Estaba pensando en otra opción más: la de hacer un array de 40 punteros char, pero luego pensé que había que reservar 10 car. por cada uno, así que la explicación era más complicada, así que lo abandoné a la mitad.

Esto pasa por no repasar los mensajes
08/11/2014 #6

Avatar de TRILO-BYTE

a todos nos pasa escribir una cosa por otra luego aveces pongo un ejemplo y veo que el que codigo que publico era el que no funcionaba y debo editarlo
09/11/2014 #7


O sea, yo quiero que una variable x1 guarde el último valor de k antes de que sea igual a "A"
Algo así:

x=&k;
x1=*x;

k="a";
09/11/2014 #8

Avatar de JoaquinFerrero

Cuando haces

x = &k;

no estás guardando el valor de k dentro de x, sino el valor de la dirección que apunta a la variable char k. Eso significa que si cambias k, también cambias *x (el contenido apuntado por x), o al revés, si cambias *x, estás cambiando k.

Entonces, tu código
Código PHP:
int save (k) {
    
x  = &k;
    
x1 = *x;

    return 
x1

es lo mismo que
Código PHP:
int save () {
    
x1 k;

    return 
x1

Y luego ya puedes cambiar el valor de k.
18/01/2015 #9

Avatar de JoaquinFerrero

JoaquinFerrero dijo: Ver Mensaje
Para guardar información en la memoria libre, primero hay que reservarla.

Tradicionalmente, eso se hace con funciones como malloc/free (en caso de que las bibliotecas del compilador las soporten).
Una ampliación a mi comentario: en las nuevas versiones de los compiladores de C, que ya sean compatibles con la norma C99 o C11, se pueden usar los llamados "arrays de longitud variable", que permite ahorrar todo el código de malloc/free. Basta, simplemente, con definirlos:

int vector[n];

siendo 'n' el número de elementos a reservar, que puede ser, por ejemplo, un argumento pasado al programa o a la función.

En ese momento se produce la reserva de memoria, generalmente en la pila del procesador. La liberación se produce cuando termina el contexto en donde se define (programa o subrutina).
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.