Avatar billede top Nybegynder
04. november 2001 - 01:28 Der er 11 kommentarer og
1 løsning

caste til en struct i c

Jeg skal have castet en char[100] til en struct. Hvordan gør jeg det?
(det var let nok at caste den anden vej - hvis det ellers virker ..)
Avatar billede alvion Nybegynder
04. november 2001 - 09:07 #1
Er du klar? :-)

typedef struct {
    char a[50];
    char b[50];
} mystruct;

int main(int argc, char* argv[])
{
    char c[100];
    mystruct m;

    m = *((mystruct *)&c);
}
Avatar billede top Nybegynder
04. november 2001 - 12:44 #2
Det er muligt det virker, men når jeg så skal referere til fx a fra min struct i m skriver jeg så ikke fx

printf(\"%s\", m.a);

:-?
Avatar billede alvion Nybegynder
04. november 2001 - 13:02 #3
Jo lige præcis. Det afhænger jo selvfølgelig af, hvordan din struct ser ud.
Avatar billede alvion Nybegynder
04. november 2001 - 13:02 #4
Hvad skal du bruge det til?
Avatar billede alvion Nybegynder
04. november 2001 - 13:08 #5
Bemærk at jeg har lavet en assignment, hvilket jo blot var for at give et eksempel på typecasting
Avatar billede top Nybegynder
04. november 2001 - 13:28 #6
Jeg har følgende struct:

typedef struct {
        frame_kind kind;
        seq_nr seq;
        seq_nr ack;
        packet info;
} frame;

som jeg undervejs er nødt til at caste til en char[100].
Der er begrænsninger på de forskellige var, så de burde kunne passe ind på 100bytes.

Jeg caster til char ved

char buf[100];
frame s;
s.kind=...
...(forskellige tildelinger)

buf = (char *)&s;

og forsøger at caste tilbage i en anden funktion med

buffer[100];
frame s;

s = *((frame *)&buffer);
printf(\"data %i\\n\", s.seq);

med det ser ud som om seq altid er det samme .-(

Er det min cast til char i starten der er forkert?

Avatar billede top Nybegynder
04. november 2001 - 13:34 #7
correction:

buf = (char *)&s;

kan ikke compileres .-(

ps - hvordan smider man flere point efter dig?
Avatar billede alvion Nybegynder
04. november 2001 - 18:05 #8
Du har et link i toppen til venstre, der hedder noget med \"Tildel flere point\"

Jeg skal lige spise og gå med hunden, så kigger jeg på det.
Avatar billede alvion Nybegynder
04. november 2001 - 18:06 #9
Åhh... Du har accepteret spørgsmålet, så kan du ikke give flere point. Men det gør heller ikke noget. :-)
Avatar billede alvion Nybegynder
04. november 2001 - 18:07 #10
Kan du ikke lige skrive hvad dine typer i struct\'en er defineret som?
Avatar billede alvion Nybegynder
04. november 2001 - 20:33 #11
Jeg ville nok benytte en memcpy til at flytte data mellem din struct og din char buffer - og omvendt når du modtager char bufferen igen.

Din char buffer er jo en pointer og det andet er en almindelig struct variabel, så du vil få en masse bøvl. Prøv med dette (jeg har gættet på, hvad dine typedefs har været)


typedef unsigned int frame_kind;
typedef unsigned int seq_nr;
typedef short packet[38];

typedef struct {
        frame_kind kind;
        seq_nr seq;
        seq_nr ack;
        packet info;
} frame;


void main(int argc, char* argv[])
{
    char buf[100];
    frame s, t;

    s.kind = 123456789;
    s.seq = 987654321;
    s.ack = 42;
    memset(s.info, 47, 38);

    printf(\"%d\\n\", s.ack);

    memcpy(buf, &s, sizeof(s));

    memcpy(&t, buf, sizeof(t));

    printf(\"%d\\n\", s.ack);
}
Avatar billede soepro Nybegynder
05. november 2001 - 09:19 #12
Du kunne også bruge en union:

union
{
  char somChar[100];
  frame somStruct;
} somJegHarLyst;

Du kan som komme til begge dele sådan her:

printf(\"Min struct som char: %s\", somjegHarLyst.somChar);
printf(\"Min struct vha. membernavne: %d\", somJegHarLyst.somStruct.seq);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester