Info I Electronica. Aporte y duda

Discusión cerrada
  1. #1
    Avatar de Lalala*Tfc
    Registración
    Mar 2004
    Mensajes
    699

    Info I Electronica. Aporte y duda

    Buenas, el dia 18, fui a rendir un final, que me fue mal, por uniones. Ahora tengo el enunciado.

    Se quiere leer un archivo base.txt, que contiene Apellido (30 caracteres), legajo (long), nota 1 (int), nota 2 (int). De los cuales, se quiere, ordenar alfabeticamente, e imprimir. Luego, se tiene que enviar por el puerto 0x300 utilizando uniones. Todos los datos tienen que ser cargado en la memoria.

    Ahora mi duda, practicamente hice todo bien, pero no entiendo como usar uniones. Q es mejor ? Como se hacer? Gracias!
    • Me gusta
    Me gusta
    Citar Mensaje original enviado por CoRdErItO!!!
    No notaste que en el teclado viene la A, la S, la D y cuando estas al pedo escribis asdasdasd?

    En realidad significa: Asociacion Salaminera De Argentinos Sangrientos Donde Alguien Soba Dedos
     

  2. Compartí este Tema:
    • Vistas: 408
    • Mensajes: 6
    Seguí este Tema: Suscribite
  3. #2
    Avatar de Lalala*Tfc
    Registración
    Mar 2004
    Mensajes
    699

    Re: Info I Electronica. Aporte y duda

    ayuda? :S
    • Me gusta
    Me gusta
    Citar Mensaje original enviado por CoRdErItO!!!
    No notaste que en el teclado viene la A, la S, la D y cuando estas al pedo escribis asdasdasd?

    En realidad significa: Asociacion Salaminera De Argentinos Sangrientos Donde Alguien Soba Dedos
     

  4. #3
    Blue Hedgehog Avatar de Sonic
    Registración
    Feb 2003
    Mensajes
    7,074

    Re: Info I Electronica. Aporte y duda

    No sirven para mucho realmente; pero bueno, si te piden eso...

    La idea sería más o menos la siguiente: Una union es una estructura de datos que permite una especie de polimorfismo; podés leer el mismo espacio de memoria como si fuera de distintos tipos. A nivel implementación, ocupa el mismo espacio que la estructura más grande que forme parte de la union, y las reinterpretaciones según lo leas como uno u otro tipo de datos se realizan a nivel de bits.

    Ej:
    Código:
    union {
      short foo;
      char bar[2];
    }foobar;
    En la mayoría de las implementaciones el short 'mide' 2B. El char, 1. En este caso la idea es usar el tipo de dato short y manejarlo de a un byte con los char. Entonces la union se puede usar como foobar.foo = 0xEEFF; y después la dejás en un port con foobar.bar. El tema es que según la implementación (y el endianness del hardware), bar[0] puede ser 0xEE ó 0xFF.

    Todo esto aplicado a tu final quedaría algo así. Igual estaría bueno que lo hagas entero para verlo funcionando y que le tomes la mano. Hice una sola 'ficha'. Fijate como sería si fueran más como en el ejercicio.
    Código:
    struct foo {
      char apellido[31]; // Suelen ser hiper rompe pelotas en Info 1 con el tema de las null-terminated strings, así que contá bien los caracteres.
      long legajo;
      int nota1;
      int nota2;
    }; // también rompen las pelotas con este punto y coma.
    
    union bar {
      struct foobar;
      char pepe[sizeof(struct foo)];
    };
    
    #include "dos.h"
    int main() {
      union bar myfoobar; // Instanciás únicamente la union bar que vas a usar.
      (...) // Abrís el stream, sorteás el archivo, lo que sea que tengas que hacer.
      for (int i = 0; i < sizeof(struct foo);  i++) {
        outportb(myfoobar.pepe[i], 0x300);
      } // Asumo una especie de sincronismo instantáneo y perfecto, salvo que lo pidan explicitamente, no hace falta en Info 1 hacer nada más hasta donde sé.
      (...) // Hacés el cleanup que haga falta
    return 0;
    }
    Hace bastante que no toco C así que por ahí hay algún error de sintaxis, pero la idea es esa.
    • Me gusta
    Me gusta
     

  5. #4
    Avatar de Lalala*Tfc
    Registración
    Mar 2004
    Mensajes
    699

    Re: Info I Electronica. Aporte y duda

    Buenas, che gracias x por la respuesta. te hago 2 preguntas:

    cuando usas

    union bar {
    struct foobar;
    char pepe[sizeof(struct foo)];
    };


    en vez de struct foobar, no seria foo?

    y cuando usas.

    union bar myfoobar; // Instanciás únicamente la union bar que vas a usar.

    Lo que no entiendo es esto. Yo aca que tendria que hacer ? 500 registros de struct?, para despues pasarlo a una union y enviarlo?
    500 registros de union ? (que adentro tengan la info de los alumnos)
    Como es el tema del envio, osea, entiendo que las uniones "meten todo dentro de una bolsa" y lo envian, pero como le mando el legajo para enviar ? Gracias
    • Me gusta
    Me gusta
    Última edición por Lalala*Tfc : 25-02-10 el 12:05 PM
    Citar Mensaje original enviado por CoRdErItO!!!
    No notaste que en el teclado viene la A, la S, la D y cuando estas al pedo escribis asdasdasd?

    En realidad significa: Asociacion Salaminera De Argentinos Sangrientos Donde Alguien Soba Dedos
     

  6. #5
    Blue Hedgehog Avatar de Sonic
    Registración
    Feb 2003
    Mensajes
    7,074

    Re: Info I Electronica. Aporte y duda

    sería struct foo foobar, me comí el nombre de la estructura. struct foo es el tipo y foobar el nombre de esa variable en la union.

    Perdón, lo de la instanciación lo expliqué para el orto. Lo que te quería decir es que no tenés que declarar ni definir ninguna estructura, solamente el array de 500 uniones por ejemplo.

    El tema del envío es byte a byte. Por eso usás uniones con chars adentro, porque el char mide un byte. En el ejemplo que te di se ve como mandar una única estructura por medio de uniones. En tu ejemplo tendrías que mandar 500 de esa misma manera.

    De nuevo, es muy irreal la manera esa de hacerlo. Estás escribiendo un port sin saber si fue leido ni nada, en la práctica eso no funcionaría ni a ganchos. Pero como no te piden que sincronices con lo que sea que lo va a leer, no hay problema.
    • Me gusta
    Me gusta
     

  7. #6
    Avatar de Lalala*Tfc
    Registración
    Mar 2004
    Mensajes
    699

    Re: Info I Electronica. Aporte y duda

    claro pero con el tema del envio puedo solo mandar el legajo? Podria pone
    Struct alumno
    {
    long legajo;
    int nota1;
    int nota2;
    char apellido[31];
    };
    Y solo envio los 4 bits o el sizeof(legajo) no? Che gracias por la mano
    • Me gusta
    Me gusta
     

  8. #7
    Blue Hedgehog Avatar de Sonic
    Registración
    Feb 2003
    Mensajes
    7,074

    Re: Info I Electronica. Aporte y duda

    Sssse. A efectos del final, sí, es válido hacer eso. No es muy bonito ni funciona en todos lados, pero vale. Iterá sobre los primeros cuatro bytes (char) de la union.
    • Me gusta
    Me gusta
     

  9. Compartí este Tema:
    • Vistas: 408
    • Mensajes: 6
    Seguí este Tema: Suscribite
Discusión cerrada