Autor Tema: Error al declarar estructura PIC24 C30  (Leído 4658 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Error al declarar estructura PIC24 C30
« en: 17 de Octubre de 2010, 16:26:47 »
Hola

Quiero declarar una estructura como un typedef y luego crear una variable a partir de ella. El código lo coloco fuera de main():

Código: [Seleccionar]
typedef struct SENSOR
{
float tmin=15.0;
float tmax=25.0;
};

SENSOR s1;

Pero C30 se niega a compilarlo y no sé porqué. Probé varias formas de declarar la estructura, pero no hubo buenos resultados.

Código: [Seleccionar]
main.c: At top level:
main.c:30: warning: no semicolon at end of struct or union
main.c:30: error: syntax error before '=' token
main.c:32: error: syntax error before '}' token
main.c:34: error: syntax error before 's1'
main.c:34: warning: type defaults to 'int' in declaration of 's1'
main.c:34: warning: data definition has no type or storage class

También encontré en un foro que hay que aplicarle un attribute, pero se me hace raro. Aún así probé y tampoco.

Admito que soy algo torpe con struct  :?

¿Alguna pista?

EDIT: Curiosamente esta estructura sí compila...

Código: [Seleccionar]
struct s
{
int x;
} t;
« Última modificación: 17 de Octubre de 2010, 16:38:34 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Error al declarar estructura PIC24 C30
« Respuesta #1 en: 17 de Octubre de 2010, 16:47:23 »
 :oops:

Con mi nivel de novato con struct acabo de aprender que una estructura no puede contener elementos inicializados. Esto NO compila:

Código: [Seleccionar]
typedef struct SENSOR
{
float tmin=15.0;
float tmax=25.0;
};

SENSOR s1;

Y esto SÍ:

Código: [Seleccionar]
typedef struct// __attribute__((__packed__))
{
float tmin;
float tmax;
} SENSOR;

SENSOR s1;

Queda ahí para el recuerdo.  :D

Y sobre el atributo packed, sólo sirve para que las variables queden juntas en ram, sin padding.

Citar
packed
The packed attribute specifies that a structure member should have the smallest possible alignment unless you specify a larger value with the aligned attribute.

Here is a structure in which the member x is packed, so that it immediately follows a, with no padding for alignment:

struct foo
{
char a;
int x[2] __attribute__ ((packed));
}; Note: The device architecture requires that words be aligned on even byte boundaries, so care must be taken when using the packed attribute to avoid run-time addressing errors.
{/quote]

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Error al declarar estructura PIC24 C30
« Respuesta #2 en: 17 de Octubre de 2010, 17:17:08 »
 :D :D Últimamente vienes haciendo varios monólogos!  :D Es raro que quieras crear definición de una estructura con sus datos inicializados  :? Tendrás tantas estructuras del mismo estilo con los mismos datos inicializados? La idea de definir un tipo de estructura es porque se utilizará repetidas veces, ya sea en la creación de variables temporales en funciones (Variables locales), o como retorno o parámetro de una/s funcion/es  ;-)


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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Error al declarar estructura PIC24 C30
« Respuesta #3 en: 17 de Octubre de 2010, 17:57:36 »
Sí, eso de trabajar en fin de semana lo deja a uno sólo.

Nunca había usado estructuras, no me parecían útiles... hasta ahora. Sí, tendré todos los valores inicializados iguales, por ello quería declararlos así, pero ya creé una función para inicializarlos automáticamente.

Código: [Seleccionar]
//Inicializa estructuras de SENSOR
void InicializaSENSOR(SENSOR *s)
{
s->tmin=INI_TMIN;
s->tmax=INI_TMAX;
}

Saludos.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Error al declarar estructura PIC24 C30
« Respuesta #4 en: 17 de Octubre de 2010, 18:36:52 »
En realidad si se pueden inicializar estructuras (no estructuras en sí, sino una instancia de una estructura), pero no como vos lo estabas haciendo. La forma correcta seria asi:
Código: C
  1. struct SENSOR
  2. {
  3. float tmin;
  4. float tmax;
  5. } s1={15.0,25.0};

Mas adelante en el codigo podrias iniciar una nueva estructura asi:
Código: C
  1. struct SENSOR s2={10.0,20.0};

saludos!!!
« Última modificación: 18 de Octubre de 2010, 01:16:17 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: Error al declarar estructura PIC24 C30
« Respuesta #5 en: 17 de Octubre de 2010, 18:49:11 »
 :mrgreen:

Eso me gusta Gera. Lo voy a poner en práctica.

Te quito tu estrella y te la reemplazo por una más grande  :D

Gracias.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Error al declarar estructura PIC24 C30
« Respuesta #6 en: 17 de Octubre de 2010, 20:02:14 »
:mrgreen:

Eso me gusta Gera. Lo voy a poner en práctica.

Te quito tu estrella y te la reemplazo por una más grande  :D

Gracias.

wiii gracias!! :D jaja. Me alegra q te haya servido

"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: Error al declarar estructura PIC24 C30
« Respuesta #7 en: 17 de Octubre de 2010, 21:54:41 »
wiii gracias!! :D jaja. Me alegra q te haya servido

Ya está funcionando y gestionando. Gracias de nuevo.

Si conoces más tips sobre estructuras, tengo más estrellitas gratis para ti  :D

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Error al declarar estructura PIC24 C30
« Respuesta #8 en: 18 de Octubre de 2010, 01:14:50 »
Depende de tus necesidades. Algo interesante es el tema de punteros a estructuras. Se vuelven esenciales cuando trabajamos con estructuras dinamicas como pilas, colas, listas..
Tambien son utiles cuando queremos pasar estructuras como parametro a una funcion. O cuando queremos que una funcion retorne mas de un valor, le mandamos como parametro un puntero a una estructura, y en ella almacenamos los valores que la funcion tiene que retornar.
El unico tip q te puedo dar sobre este tema, es q cuando accedemos a un valor de una estructura por medio de un puntero, no se hace con el punto, sino con una flecha. Siguiendo con el ejemplo anterior:
Código: C
  1. struct SENSOR *ptr=&s1;
  2. ptr->tmin=5.0;

La verdad q yo tampoco les veia utilidad a las estructuras, hasta q aprendi estas cosas y me solucionaron la vida jeje.
saludos!!

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Error al declarar estructura PIC24 C30
« Respuesta #9 en: 18 de Octubre de 2010, 01:51:09 »
Código: [Seleccionar]
typedef struct SENSOR
{
float tmin=15.0;
float tmax=25.0;
};

SENSOR s1;

¿Y no será que te falta ponerle un nombre al typedef?. Si no lo interpreto mal, SENSOR es el nombre del struct, pero no del typedef ya que debería estar situado tras la llave cerrada y antes del punto y coma, ¿no?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Error al declarar estructura PIC24 C30
« Respuesta #10 en: 18 de Octubre de 2010, 10:23:11 »
Hola Gera. Sí, estoy familiarizado con las flechitas apuntadoras, así es como inicializaba mi estructura hasta que me propusiste la otra idea. En la siguiente versión del proyecto ya usaré arreglo de estructuras, se va a poner interesante  ;-)

Hola Nocturno. El typedef está funcionando al 100% así...

Código: [Seleccionar]
typedef struct
{
float tmin;
float tmax;
} SENSOR;

SENSOR s1={15.0, 25.0};

Hay muchas formas de declarar las estructuras, pero ninguna de ellas contempla la inicialización de sus valores internos, sólo es posible con el método de Gera.

Por cierto, un poco offtopic... C30 es pésimo para conversiones de FLOAT a STRING. Ayer estaba convirtiendo los floats de la estructura así:

Código: [Seleccionar]
sprintf(str, "%f", (double)s1.tmin); //c30 se enoja si no lo paso como double
Y esa simple, llana e inofensiva línea de código me ocupó 3000 instrucciones del PIC24 que equivalen a 6000 Bytes de ROM interna... es un monstruo come-bytes. Voy a tener que cambiar los floats por enteros sencillos y evitar toda operación flotante. Pasé en 1 segundo del 77% de uso de ROM al 90% de ROM...  :2]

Es ahora cuando se extraña el CPU con punto fijo de los primos del PIC24, los dsPIC.  :D
« Última modificación: 18 de Octubre de 2010, 10:25:55 por migsantiago »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Error al declarar estructura PIC24 C30
« Respuesta #11 en: 18 de Octubre de 2010, 12:19:49 »
De ultima podes separar la parte entera y decimal, y despues las imprimis.
Código: C
  1. float tmin = 12.345;
  2. int entero = (int)tmin;
  3. int decimal = (int)((tmin - entero) * 1000); //depende de la presicion
  4. printf("%d.%d",entero,decimal);

Es una solucion media fea, pero por ahi sirve. Si todavia te sigue ocupando mucho el printf, podes convertir los enteros en strings con itoa() y los concatenas.
saludos!!

"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: Error al declarar estructura PIC24 C30
« Respuesta #12 en: 18 de Octubre de 2010, 12:44:05 »
De ultima podes separar la parte entera y decimal, y despues las imprimis.
Código: C
  1. float tmin = 12.345;
  2. int entero = (int)tmin;
  3. int decimal = (int)((tmin - entero) * 1000); //depende de la presicion
  4. printf("%d.%d",entero,decimal);

Es una solucion media fea, pero por ahi sirve. Si todavia te sigue ocupando mucho el printf, podes convertir los enteros en strings con itoa() y los concatenas.
saludos!!

Sí, anoche mientras dormitaba llegue a una solución 99% similar  :mrgreen:

Pero después me di cuenta que puedo evitar toooda la conversión flotante ya que cuento con un aliado oculto... Javascript. Dejaré que Javascript en el browser calcule todos los flotantes y conversiones y que envíe los datos al PIC por HTTP ya en entero.

Ahorro ROM y RAM y saco provecho del browser del usuario que administre el monitor.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Error al declarar estructura PIC24 C30
« Respuesta #13 en: 18 de Octubre de 2010, 12:53:48 »
Buenisimo entonces. Siempre es mejor dejarle el trabajo pesado a la PC jeje.
saludos y suerte con el proyecto!! :wink:

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

Desconectado nicolas8702

  • PIC10
  • *
  • Mensajes: 6
Re: Error al declarar estructura PIC24 C30
« Respuesta #14 en: 29 de Junio de 2011, 23:45:57 »
hola a todos soy nuevo programando en c30  y tengo problemas al declarar varios arreglos tipo float de 128 posiciones cada uno ,pero al compilar me sale estre error


glcd.o: Link Error: Could not allocate section .ndata, size = 982 bytes, attributes = data near
 Link Error: Could not allocate data memory
Link step failed.


agradezco si alguien sabe como resolverlo