Autor Tema: dudas con punteros  (Leído 6788 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
dudas con punteros
« en: 30 de Abril de 2009, 06:03:08 »
hola, quería preguntar que hace esta instrucción, sé que tiene algo que ver con los punteros... pero por más que miro no lo entiendo:

Código: [Seleccionar]

    TxBuffer[TxData++] = estructura.direccion[0]->entrada1;
    TxBuffer[TxData++] = estructura.direccion[0]->entrada2;

estructura.direccion[0] tiene almacenado 0x0119, que tiene un 0x00, pero... ¿eso no es memoria RAM? de todos modos, ambos parámetros apuntarían al mismo valor, pero en TxBuffer los valores son los correctos.


Programo en C18 y tengo un pic 18f4620

Gracias. saludos

 

 

« Última modificación: 30 de Abril de 2009, 06:14:37 por cucu »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #1 en: 30 de Abril de 2009, 09:58:21 »
Este es un caso de estructura de una estructura. Vos tenes una estructura q se llama "estructura", y a la vez un elemento de esa estructura es direccion[0] es otra estructura. Dentro de esta ultima, hay un puntero "entrada1" y otro "entrada2", que apuntan a distintos lugares. El operador -> significa q estamos accediendo al valor q apunta un elemento de la estructura. Osea q el valor q estas cargando en TxBuffer[TxData++] en la primera linea, es el valor al q esta apuntando entrada1.
Espero q se haya entendido, cualquier cosa pregunta.
Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: dudas con punteros
« Respuesta #2 en: 01 de Mayo de 2009, 01:26:13 »
 :z) changos
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #3 en: 01 de Mayo de 2009, 11:08:34 »
Si no se entendio avisenme y les doy un ejemplo o algo.. bah, se los doy de todos modos jeje.
Supongamos q tenemos las siguientes estructuras
Código: C
  1. struct punto {
  2.    int x;
  3.    int y;
  4. };
  5.  
  6. struct {
  7.   int x;
  8.   char * string;
  9.   struct punto pto;
  10. } str, *ptr = &str;

Vemos que punto es una estructura comun y corriente que contiene dos enteros. Y str es una estructura que contiene un entero, un puntero a char, y una estructura de tipo punto. Al final de la definicion de str, creamos una estructura de este tipo, y un puntero a esta.
Entonces, si queremos acceder a los elementos de la estructura directamente, podemos hacer esto:
Código: C
  1. str.x = 30;
  2. str.string = "Hola mundo";
  3. str.pto.x = 2;
  4. str.pto.y = 3;

Hasta aca no he dicho nada nuevo supongo. Ahora vamos a ver como accedemos a los elementos de la estructura a traves del puntero a apunta a esta:
Código: C
  1. ptr->x = 30;
  2. ptr->str = "Hola mundo";
  3. ptr->pto.x = 2;
  4. ptr->pto.y = 3;

Vemos que en este caso, tenemos q usar el operador ->, que significa q vamos a acceder al contenido de la estructura a la cual apunta el puntero. Seria parecido al * cuando usamos punteros a variables.
Esto es muy util cuando tenemos q pasar a una funcion una estructura como parametro, simplemente pasamos un puntero a esta :wink:
Bueno, espero q se haya entendido mejor. Cualquier duda pregunten :)
« Última modificación: 01 de Mayo de 2009, 11:10:36 por gera »

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dudas con punteros
« Respuesta #4 en: 01 de Mayo de 2009, 11:59:55 »
Hey Gera. ¿Se puede hacer esto en C?

str.string = "Hola mundo";

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: dudas con punteros
« Respuesta #5 en: 01 de Mayo de 2009, 12:43:25 »
Mucho mas claro ... como se aprende ... cooomo se aprende.

Vamos a ver si el CC$ deja hacer tantas bellezas

Saludos y gracias GERA
El papel lo aguanta todo

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #6 en: 01 de Mayo de 2009, 12:56:36 »
Hey Gera. ¿Se puede hacer esto en C?

str.string = "Hola mundo";

Santi, si se puede. La cadena "hola mundo" esta cargada en memoria, ya que es una constante q usa nuestro programa, al hacer esa igualacion, decimos q el puntero string apunte a ese lugar de memoria.
Lo q no se puede hacer es lo siguiente:
Código: [Seleccionar]
char string[16];
string="hola";
Ya que en este caso string es un puntero estatico. No podemos hacer q apunte a otro lugar q no sea el q le fue asignado. Por lo tanto, si queremos q apunte a un "hola", tenemos q copiar esa cadena a su espacio de memoria.
Saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: dudas con punteros
« Respuesta #7 en: 02 de Mayo de 2009, 16:47:31 »
Hola Gera

¿puedes explicar un poco mas detallado esto de las estructuras en ccs?.

Gracias.
Un Saludo
« Última modificación: 02 de Mayo de 2009, 17:11:01 por pajaro »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #8 en: 02 de Mayo de 2009, 17:32:46 »
Hola pajaro,
cual es especificamente tu duda? Las estructuras en CCS son iguales a las estructuras de cualquier otro compilador. Si no tenes claro el tema de estructuras, en internet podes encontrar infinidad de cursos de programacion donde dedican capitulos enteros a las estructuras. Cualquier duda puntual q te surja pregunta.
suerte!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: dudas con punteros
« Respuesta #9 en: 04 de Mayo de 2009, 03:32:27 »
Genial! gracias, me he enterado por fin de lo que significa ->.

Ahora otra dudilla relacionada aunque igual es más de uso de la memoria... si es así decirme y lo pongo en otro sitio...

Yo con punteros normales en MPLAB puedo ver lo que contiene, veo a que posición de memoria apunta, la busco en el mapa de memoria y ya está.

¿Con este tipo de estructuras, se haría igual? Eso es lo que supongo pero después todas me apuntan a la dirección 0.

De nuevo gracias por la ayuda. Saludos

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #10 en: 04 de Mayo de 2009, 11:05:10 »
Hola cucu,
me alegro haber aclarado tu duda. Cuando un puntero contiene 0, se dice q es un puntero a NULL y no apunta a ningun lado. Cuando se declara un puntero se lo suele inicializar con este valor para evitar tocar posiciones de memoria basura. Supongo q MPLAB por defecto los inicializa asi. Cuando le asignas una posicion de memoria al puntero, sigue siendo nulo?

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros a constantes
« Respuesta #11 en: 24 de Enero de 2010, 22:47:23 »
Tengo el siguiente problema con los punteros. Hago este ejemplo en C18 y funciona sin inconvenientes:

Código: C
  1. const rom char Buffer[30]="Hola mundo cruel...:(";
  2.  
  3.  
  4. void funcion(const rom char *ptr){
  5.         ....
  6. }
  7.  
  8. void main(){
  9.    funcion(Buffer);

Pero lo hago en CCS y no me deja compilarlo  :5]

Código: C
  1. const char Buffer[30]="Hola mundo cruel...:(";
  2.  
  3.  
  4. void funcion(const char *ptr){
  5.  
  6.         ....
  7. }
  8.  
  9.  
  10. void main(){
  11.  
  12.    funcion(Buffer);

La idea era tener varios buffer constantes, y que la función trabaje con alguno de ellos dependiendo del caso, pero el CC$ no me deja  :? Como se podría hacer ?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dudas con punteros
« Respuesta #12 en: 24 de Enero de 2010, 22:58:08 »
Hola, ¿qué error te arroja ccs? Creo que es el típico de "no se permiten apuntadores a rom".

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: dudas con punteros
« Respuesta #13 en: 24 de Enero de 2010, 23:03:52 »
Seguramente es porque en la mayoria de las versiones(anteriores) del CCS, los arrays constantes son ubicados en la ROM.

Lamentablemente los punteros solo pueden apuntar a la RAM. Falla porque estas intentando guardar en un puntero RAM, una posicion ROM.

En las versiones nuevas del CCS, se ha agregado la opcion de poder cargar en RAM los arrays constantes automaticamente, de manera "transparente" para el programador.

Cuando yo en CCS tengo que trabajar con varias cadenas constantes, hago un solo array y ubico alli dentro todos juntos. Como por lo general suelen ser de tamaño distinto, genero otro array que contiene las posiciones inicial y final de cada uno dentro del array que contiene a todos.

Ejemplo:

Código: C
  1. #DEFINE str_emergencia      0
  2. #DEFINE str_confirma          1
  3. #DEFINE str_modo_grafico   2
  4.  
  5. const unsigned int16 indice_strings[] = {0,93,168,180};
  6.  
  7. const char strings[] = {"\"Modo Recuperacion de emergencia\" Presione la tecla A para Cancelar o la tecla B para Aceptar¿Esta seguro? Presione la tecla A para Cancelar o la tecla B para ConfirmarModo grafico"};
  8.  
  9. void imprimeString(char nroString){
  10.       unsigned int16 i;
  11.      char c;
  12.  
  13.       for(i=indice_strings[nroString];i<indice_strings[nroString+1];i++){
  14.           c=strings[i];
  15.           printf("%c",c);
  16.      }
  17.          printf("\r\n");
  18.        //....
  19. }
  20.  
  21. //ejemplo de uso:
  22. imprimeString(str_confirma);

Hay otras posibilidades también. Desde más sencillas hasta mas complejas.

Un saludo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #14 en: 24 de Enero de 2010, 23:11:53 »
Osea que no puedo utilizar punteros a variables que están en la ROM en CCS, ouch! pequeño gran problema  :D Bueno, lo voy hacer en C18 que no da problemas  :mrgreen:

Es buena la idea que das Bruno, pero se le dan muchas vueltas para algo tan sencillo.


Saludos!
No contesto mensajes privados, las consultas en el foro