TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MLO__ en 25 de Abril de 2009, 15:53:11

Título: Asignacion de valores a estructuras
Publicado por: MLO__ en 25 de Abril de 2009, 15:53:11
Hola.

Mi duda corresponde a asignar los valores a una estructura, pero quiero hacerlo a todos los elementos de la estructura en una sola linea de codigo.

Por ejemplo, supongamos la estructura:

struct BytesEjemplo
{
 int8 byte1;
 int8 byte2;
 int1 Flag1;
} Ejemplo;

Se que en el main uno puede asignar el valor de la manera: Ejemplo.byte1 = 5; Si quisiera que la estructura Ejemplo tenga los valores {5,5,0} como hago para asignarlo en una sola linea de codigo? si se puede hacer? o me toca asignar el valor elemento por elemento?

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 25 de Abril de 2009, 16:35:06
Podría ser con una función de una sola línea de código:

Código: [Seleccionar]
struct BytesEjemplo
{
 int8 byte1;
 int8 byte2;
 int1 Flag1;
} Ejemplo;

...

void EscribeStruct(BytesEjemplo *estru, int8 b1, int8 b2, int1 f)
{
estru->byte1=b1;
estru->byte2=b2;
estru->Flag1=f;
}

//Y se llamaría así
EscribeStruct( &Ejemplo, 0x22, 0x34, true);

Lo acabo de escribir, talvez tenga errores de sintaxis, pero al menos te dejo la idea de cómo podrías llevarlo a cabo. Si no te sugieren algo mejor, pruébalo y nos avisas  :P
Título: Re: Asignacion de valores a estructuras
Publicado por: cerebro en 25 de Abril de 2009, 16:54:56
 :( , no permite sobrecargar operadores CCS?  :(
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 25 de Abril de 2009, 17:28:30
No, porque no es C++, no es orientado a objetos.
Título: Re: Asignacion de valores a estructuras
Publicado por: jgpeiro06 en 25 de Abril de 2009, 18:30:48
Creo que se puede realizar de esta manera... Simplemente pones los valores entre corchetes con la misma organización que la estructura. Estoy seguro de que esto funciona si asignas un valor al dato cuando lo declaras, pero no se si se puede seguir haciendo en cualquier otro punto del programa.
Yo uso el MPLAB C30, no se si sera igual en el CCS...

Código: C
  1. struct BytesEjemplo
  2. {
  3.  int8 byte1;
  4.  int8 byte2;
  5.  int1 Flag1;
  6. }Ejemplo;
  7. ....
  8. struct BytesEjemplo strct1 = {1,2,3};
  9. ....
  10. strct1 = {4,5,6};
  11. ....

Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 26 de Abril de 2009, 01:52:21
Hola.

migsantiago: Voy a intentarlo asi, habia pensado en una funcion, pero llegue a suponer que habia una forma mas facil de hacerlo.
jgpeiro: Fue lo primero que intente pero el compilador marca error de sintaxis -CCS tiene sus cosas-

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 26 de Abril de 2009, 12:47:52
jgpeiro: Fue lo primero que intente pero el compilador marca error de sintaxis -CCS tiene sus cosas-

Saludos

Lo que sugiere Jgpeiro no se puede hacer en tiempo de ejecución, solo al momento de declarar la variable. Eso pasa en todos los compiladores de C, no solo en CCS.
Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 27 de Abril de 2009, 15:55:28
aahhh

Ok. Gracias

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: jgpeiro06 en 28 de Abril de 2009, 04:46:50
Citar
Lo que sugiere Jgpeiro no se puede hacer.
Oye, que si se puede hacer!! Bueno, no exacatamente como indicaba en mi post anterior, pero que si se puede asignar el valor a todos los miembros de la estructura en cualquier punto del programa, por lo menos con el MPLAB C30.

Lo único que hay que hacer es el casting"(struct BytesEjemplo)" para que el compilador sepa de que tipo son los datos.
Código: C
  1. struct BytesEjemplo
  2. {
  3.         int byte1;
  4.         int byte2;
  5.         int Flag1;
  6. };
  7. //...
  8. struct BytesEjemplo strct1 = {1,2,3};
  9. //...
  10. strct1 = (struct BytesEjemplo){4,5,6};
  11. //...



Título: Re: Asignacion de valores a estructuras
Publicado por: RedPic en 28 de Abril de 2009, 05:17:25
Lo único que hay que hacer es el casting"(struct BytesEjemplo)" para que el compilador sepa de que tipo son los datos.
Código: C
  1. struct BytesEjemplo
  2. {
  3.         int byte1;
  4.         int byte2;
  5.         int Flag1;
  6. };
  7. //...
  8. struct BytesEjemplo strct1 = {1,2,3};
  9. //...
  10. strct1 = (struct BytesEjemplo){4,5,6};
  11. //...

Guau, me acabas de alegrar la mañana.  :mrgreen:
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 28 de Abril de 2009, 12:47:15
Vaya, lo desconocía. Gracias por la corrección.  :mrgreen:
Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 28 de Abril de 2009, 13:11:44
El CC$ no deja .... marca error. ... Lastima

saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 28 de Abril de 2009, 13:24:56
El CC$ no deja .... marca error. ... Lastima

¿No te dejó hacer el casting que menciona Jgpeiro o correr la función que cambia los int8?
Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 28 de Abril de 2009, 22:30:31
No dejo hacer el casting:

Código: C#
  1. strct1 = (struct BytesEjemplo){4,5,6};

CC$ version 4.057, a ti te funciono mig?

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: migsantiago en 29 de Abril de 2009, 11:13:56
mmhh no lo estoy probando, pero jgpeiro dice que le funciona en C30.
Título: Re: Asignacion de valores a estructuras
Publicado por: jgpeiro06 en 29 de Abril de 2009, 15:56:29
Citar
No dejo hacer el casting:
Que error te da exactamente el compilador?


Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 29 de Abril de 2009, 16:17:53
Hola.

El error es el siguiente:

Citar
*** Error 51 "MdlLocal.c" Line 253(26,27): A numeric expression must appear here
*** Error 76 "MdlLocal.c" Line 253(38,39): Expect ;
      2 Errors,  0 Warnings.
Halting build on first failure as requested.
Título: Re: Asignacion de valores a estructuras
Publicado por: jgpeiro06 en 29 de Abril de 2009, 17:55:06
Adjunta el archivo MdlLocal.c para que podamos revisar las lineas 253 y anteriores.
También prueba este código y comprueba si coincide con lo que tu tenias puesto en el primer post.
    -Si este código te compila en CCS ya sabes que puedes asignar las estructuras con el casting.
    -Si no te compila copia el mensaje de error que te salga.

Citar
struct BytesEjemplo{
    int8 byte1;
    int8 byte2;
    int1 Flag1;
};

int8 main(){
    int8 i, j;
    int1 k;
    struct BytesEjemplo strct1 = {1,2,3};
    for( i = 0 ; i < 4 ; i++ ){
        for( j = 0 ; j < 4 ; j++ ){
            for( k = 0 ; k < 1 ; k++ ){
                strct1 = (struct BytesEjemplo) { i, j, k};
            }
        }
    }
    return 0;
}
Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 29 de Abril de 2009, 22:21:05
Hola.

El resto de codigo esta bien, es en el que estaba trabajando en el momento del post.

Probe tu codigo:

(http://img512.imageshack.us/img512/6025/errorestructuras1.png)

Y he ahi el error ... creo que CC$ no deja hacer eso.

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: jgpeiro06 en 30 de Abril de 2009, 04:50:29
Pues nada, si no ha funcionado ya no se me ocurre que puede se puede hacer.
Supongo que en algún manual del CCS se hablara de esta problema.

Saludos
Título: Re: Asignacion de valores a estructuras
Publicado por: MLO__ en 01 de Mayo de 2009, 01:16:34
No deja... y lo que dice en la ayuda es muy poco.

Lo que he intentado es hacerlo con uniones -al menos con los int1-, pero si tengo varios bytes, pongamos unos 10 -char String1[10];- y int32 byte1; no se como iniciallizarlo con una union ..... sabes algo al respecto?

saludos