Gå til innhold

Sette sammen datatyper


Anbefalte innlegg

Skrevet (endret)

Ønsker å sette sammen flere forskjellige datatyper fra en struct slik at de blir en unsigned char..

 

Structen ser slik ut:

typedef struct disp{
unsigned char alfa;
unsigned int dp;
char streng[5];
unsigned char blink;
}disp;

 

 

Jeg vil gjerne ha dette ut i en void *message hvor alt bare ligger etterhverandre. Muligens med et skilletegn mellom hver del. Er dette mulig på noen nogenlunde forluftig måte?

:roll:

Endret av EirikO
Videoannonse
Annonse
Skrevet

noe sånt som dette? eller misforstår jeg spørsmålet? :)

 

disp myStruct;
myStruct.alfa = 0x10;   // or whatever
myStruct.dp = ...
etc.

unsigned char *message = (unsigned char *)&myStruct;

Skrevet

hmm.. Vil da message inneholde noe sånt som a5heiob?

 

alfa = a

dp = 5

streng[5] heiho

blink = b

 

??

 

Er i alle fall det jeg ønsker å oppnå. Skal nemlig sende structen gjennom en serieport.. og vil ha tilgang til alle data på andre siden...

Skrevet (endret)

Jepp! I en struct vil datamedlemmene ligge rett etter hverandre, så om du caster den til et array av bytes (unsigned char), så kan du sende hele suppa over en socket eller en seriellport eller whatever. :)

 

Skal du motta en slik struct, så kan du bare caste motsatt vei:

unsigned char *buffer; 
// sett inn kode her som allokerer minneplass til bufferet, og fyller det

disp *myStruct = (disp *)buffer;
// nå kan datamedlemmene hentes ut med myStruct->alfa, myStruct->dp osv.

 

Hvis vi bruker verdiene fra eksemplet ditt, så vil bufferet inneholde "a5heihob" som du sa. MEN! det er ikke dette du vil få ut hvis du prøver å skrive det ut direkte som en streng. Dette fordi medlemmet dp er en int, ikke en char. :)

Endret av alfred97
Skrevet

hmm.. stilig.

Går det an å gjette hvordan det vil se ut hvis man skriver det ut rett i hyperterminal?

Får ikke noe fornuftig nå, men det er kanskje rett....?

 

(C-koden kjører på et kretskort som har serieport.. Denne har jeg koblet rett i pc'en og hyperterminal...) :hmm:

Skrevet

Nja, litt av problemet ligger vel i at en int strekker seg over 4 bytes, det vil si at den tar like mye plass som 4 chars. Når verdien er 5, så vil 3 av de 4 bytene være lik 0, altså den characteren som vanligvis terminerer en streng. :)

Skrevet (endret)

oki.. Jeg får prøve meg litt frem.. Structen inneholder ikke det jeg oppga i eksempelet. Er ikke helt sikker på verdiene, faktisk... (Andres kode jeg skal fikse på og utvide...)

 

Men jeg får ut et gresk phi-tegn og en s.. Så det er da noe.

 

Takk for hjelpen, uansett.

Endret av EirikO
Skrevet

I forbindelse med direkte utskrift av char-bufferet blir det feil, ja... men det konstaterte jeg allerede til å begynne med.

Like fullt kan man fortsatt caste til et char-array og tilbake til en struct igjen uten å konvertere noe som helst. :)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...