Punteros con PIC16 en PIC C Compiler

#1
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 "A" q esta mas abajo
x1=*x;


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



}
}
}
}
 
Última edición por un moderador:
#2
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!='\0') //while(cadena!=NULL)
{
cadena;
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
 
Última edición:
#3
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 */
 
#4
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
 
#5
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 :)
 
#6
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
 
#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";
 
Última edición por un moderador:
#8
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
PHP:
int save (k) {
    x  = &k;
    x1 = *x;

    return x1; 
}
es lo mismo que
PHP:
int save () {
    x1 = k;

    return x1; 
}
Y luego ya puedes cambiar el valor de k.
 
#9
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).
 

Temas similares

Arriba