Tietotyypeistä

Hei,

En tiedä onko ajatukseni oikein:

Minulla on kuvitteellinen struct:

typedef struct{
BYTE stx; /* stx-byte */
BYTE length; /* length of the incoming msg (120 bytes) */
BYTE data[120]; /* The message from the Hospal */
BYTE crc[2]; /* The two CRC-byrtes */
BYTE eot;
} query_def;

Tuohon structiin luen seuraavanlaisen sarjaporttiviestin (huom kenttien koot):


Name******# of bytes*****value
stx*******1**************002 (0x02)
lenght*****1**************1 to 255
data******120************-
crc*******2**************0 to 65535
eot*******1**************004 (0x04)

Muuttuvatko nuo sarjaporttiviestin "kentät" oikein structissa, eli esim.

stx structissa on kooltaan tavu, eli vastaa yhtä tavua viestissä, jolloin siihen otetaan 8 ensimmäistä bittiä viestistä?
...
data-kenttään structissa luetaan 120 tavua viestistä

ja crc:hen 2 tavua crc-kohdasta viestiä?

Onko ajatukseni oikein? Luku structiin tapahtuu näin: query_def = (query_def*)serial_buffer;
Serial buffer on char-jono.
3362
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

Jos haluat kopioida suoraan serial_buffer -> query_def, niin käytä memcpy:tä.
Jos taas haluat kopioida osoittimen tyyppiin query_def, niin silloin voi käytellä = -merkkiä.

Äänestä

Olenko ymmärtänyt oikein, että kaikki kääntäjät eivät aseta structin kenttiä peräkkäin muistissa, vaan täydentävät ne 32 bitin monikertoihin. Koneet lukevat muistia nopeammin, jos luku alkaa 32 bitin kerrannaisista.

Vai kuinka tämä menee?

Äänestä
  • Aivan. Tietueen kentät ovat peräkkäin, mutta välissä voi olla ylimääräisiä tavuja. Tuo monikerta voikin sitten olla: 1, 2, 4, 8, 16 tai koodaajan määrittämä tavun monikerta.
    Tuokin on kääntäjän asetuksissa. Jos esim. käytössä on 8, niin
    typedef struct{
    BYTE stx;
    BYTE length;
    //6 ylimääräistä tavua
    BYTE data[120];
    //0 ylimääräistä tavua (120 on jaollinen 8:lla)
    BYTE crc[2];
    BYTE eot;
    //5 ylimääräistä tavua
    } query_def;

    Koneen luennan nopeus on pääosin riippuvainen:
    - 32 bittisellä koodilla 4 tavun monikerta
    - 64 bittisellä koodilla 8 tavun monikerta

    Poikkeuksena 32 bittisellä koodilla on 8 -tavuinen luku (esim. tietotyypistä double), joka pitäisi olla 8 tavun monikerta. Molemmilla on lisäksi poikkeuksena xmm -rekisterien tietotyypit, jotka vievät 16 tavua (16 tavun monikerta). Nuo xmm -tietotyypit ovat sikäli vaativampia, että jos tieto ei ole 16 tavun monikerrannainen, ohjelma kaatuu.
    Lisäpoikkeuksia ja aiheesta muutenkin tarkemmin löytyy esim.:
    www.intel.com/design/processor/manuals/248966.pdf

    Äänestä

Kommentoi aloitusta


turpatuuri kirjoitti:

Hei,

En tiedä onko ajatukseni oikein:

Minulla on kuvitteellinen struct:

typedef struct{
BYTE stx; /* stx-byte */
BYTE length; /* length of the incoming msg (120 bytes) */
BYTE data[120]; /* The message from the Hospal */
BYTE crc[2]; /* The two CRC-byrtes */
BYTE eot;
} query_def;

Tuohon structiin luen seuraavanlaisen sarjaporttiviestin (huom kenttien koot):


Name******# of bytes*****value
stx*******1**************002 (0x02)
lenght*****1**************1 to 255
data******120************-
crc*******2**************0 to 65535
eot*******1**************004 (0x04)

Muuttuvatko nuo sarjaporttiviestin "kentät" oikein structissa, eli esim.

stx structissa on kooltaan tavu, eli vastaa yhtä tavua viestissä, jolloin siihen otetaan 8 ensimmäistä bittiä viestistä?
...
data-kenttään structissa luetaan 120 tavua viestistä

ja crc:hen 2 tavua crc-kohdasta viestiä?

Onko ajatukseni oikein? Luku structiin tapahtuu näin: query_def = (query_def*)serial_buffer;
Serial buffer on char-jono.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu