/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Jeg kan ikke finde ud af structs! Hvad gør~
Fra : Jonas Jalling


Dato : 12-11-08 12:00

Hej alle,

Jeg sidder og roder med noget software der skal køre på en PowerPC i
en FPGA.
Jeg skal indsamle en masse statistiske data fra datapakker på et
datanetværk (UDP).
Disse data vil jeg gerne have lagt i den tilhørende memory og tænkte
at det var oplagt at benytte structs til at organisere det, da jeg så
nemt kan hente forskellige info fra de enkelte streams.

Jeg har følgende:

struct sStream
{
   unsigned char   InUse;
   struct   sDataHeader   DataCell;
   struct   sStreamStatistics   InitializerStatistics;
   struct   sStreamStatistics   RespondentStatistics;
   struct   sConnection   Connection;
};

struct sDataHeader
{
   Xuint32   NextStream;
   Xuint32   PreviousStream;
   Xuint32   InitializerTimeStamp;
   Xuint32   RespondentTimeStamp;
   Xuint32   InitializerIP;
};
....

Altså har jeg en hovedstruktur (sStream) med flere understrukture
(bla. sDataHeader).
Mit problem er så.. Hvordan gør jeg? Hvordan skriver jeg noget i en
understruktur?

Noget i retning af:

struct sStream myStream;
myStream->InUse = 1;
myStream->DataCell->InitializerIP = 0x12345678;

Ovenstående virker selvfølgelig ikke, men forstår I ideen?

Jeg er virkelig på bar bund og aner ikke hvor jeg skal læse og hvad
jeg skal spørge google om.

Kan I give et hint?

Mvh Jonas

 
 
Bertel Lund Hansen (12-11-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-11-08 12:13

Jonas Jalling skrev:

> Mit problem er så.. Hvordan gør jeg? Hvordan skriver jeg noget i en
> understruktur?

> Noget i retning af:

> struct sStream myStream;
> myStream->InUse = 1;
> myStream->DataCell->InitializerIP = 0x12345678;

Princippet er rigtigt, men -> bruges kun ved pointere. Ved
almindelige structs skal du bruge punktum.

   myStream.InUse = 1;
   myStream.DataCell.InitializerIP = 0x12345678;

Derimod:

   struct sStream *myStream;
   [Her reserveres der hukommelse til indholdet af myStream]
   myStream->InUse = 1;
   myStream->DataCell.InitializerIP = 0x12345678;

og hvis DataCell også er en pointer:

   myStream->DataCell->InitializerIP = 0x12345678;

Jeg kan aldrig huske om det er nok at navngive en struct ét sted,
så jeg skriver altid:

struct sStream {
   unsigned char   InUse;
   struct   sDataHeader   DataCell;
   struct   sStreamStatistics   InitializerStatistics;
   struct   sStreamStatistics   RespondentStatistics;
   struct   sConnection   Connection;
} sStream;

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Mogens Hansen (12-11-2008)
Kommentar
Fra : Mogens Hansen


Dato : 12-11-08 12:17


"Jonas Jalling" <jonas@jalling.dk> wrote in message
news:491ab74d$0$90268$14726298@news.sunsite.dk...

[8<8<8<]
> struct sStream
> {
> unsigned char InUse;
> struct sDataHeader DataCell;

sDataHeader skal være erklæret inden du kan erklære sStream

> struct sStreamStatistics InitializerStatistics;
> struct sStreamStatistics RespondentStatistics;
> struct sConnection Connection;
> };
>
> struct sDataHeader
> {
> Xuint32 NextStream;

Hvilken type er Xuint32 ?
Mener du ikke en peger til een eller anden stream-type ?

> Xuint32 PreviousStream;
> Xuint32 InitializerTimeStamp;
> Xuint32 RespondentTimeStamp;
> Xuint32 InitializerIP;
> };
> ...
>
> Altså har jeg en hovedstruktur (sStream) med flere understrukture
> (bla. sDataHeader).
> Mit problem er så.. Hvordan gør jeg? Hvordan skriver jeg noget i en
> understruktur?
>
> Noget i retning af:
>
> struct sStream myStream;
> myStream->InUse = 1;

myStream.InUse = 1;

> myStream->DataCell->InitializerIP = 0x12345678;

myStream.DataCell.InitializerIP = 0x12345678;

Hvor gemmer du myStream efter du har initialiseret den ?

Er det iøvrigt C eller C++ ?

--
Venlig hilsen

Mogens Hansen



Jonas Jalling (12-11-2008)
Kommentar
Fra : Jonas Jalling


Dato : 12-11-08 12:32

Mogens Hansen wrote:
> "Jonas Jalling" <jonas@jalling.dk> wrote in message
> news:491ab74d$0$90268$14726298@news.sunsite.dk...
>
> [8<8<8<]
>> struct sStream
>> {
>> unsigned char InUse;
>> struct sDataHeader DataCell;
>
> sDataHeader skal være erklæret inden du kan erklære sStream
>

Ja, det er den også - således:
   struct   sDataHeader DataHeader;

>> struct sStreamStatistics InitializerStatistics;
>> struct sStreamStatistics RespondentStatistics;
>> struct sConnection Connection;
>> };
>>
>> struct sDataHeader
>> {
>> Xuint32 NextStream;
>
> Hvilken type er Xuint32 ?
> Mener du ikke en peger til een eller anden stream-type ?
>

Det er en unsigned integer på 32 bit.
Men jo, det er jo egentlig en pointer til næste stream. Ligeledes
er PreviousStream.

>> Xuint32 PreviousStream;
>> Xuint32 InitializerTimeStamp;
>> Xuint32 RespondentTimeStamp;
>> Xuint32 InitializerIP;
>> };
>> ...
>>
>> Altså har jeg en hovedstruktur (sStream) med flere understrukture
>> (bla. sDataHeader).
>> Mit problem er så.. Hvordan gør jeg? Hvordan skriver jeg noget i en
>> understruktur?
>>
>> Noget i retning af:
>>
>> struct sStream myStream;
>> myStream->InUse = 1;
>
> myStream.InUse = 1;
>
>> myStream->DataCell->InitializerIP = 0x12345678;
>
> myStream.DataCell.InitializerIP = 0x12345678;
>
> Hvor gemmer du myStream efter du har initialiseret den ?
>

Ja, så er det jo ideen at den skal ned i min memory på en passende
adresse.

> Er det iøvrigt C eller C++ ?
>

Det er C - beklager jeg ikke skrev det først.

Mogens Hansen (12-11-2008)
Kommentar
Fra : Mogens Hansen


Dato : 12-11-08 14:00


"Jonas Jalling" <jonas@jalling.dk> wrote in message
news:491abec1$0$90275$14726298@news.sunsite.dk...

[8<8<8<]
> Ja, det er den også - således:
> struct sDataHeader DataHeader;

Undskyld - jeg skrev forkert.
sDataHeader skal være defineret inden du bruger den i sStream.

Der skal gælde at compileren har tilstrækkelig information, til at beregne
størrelsen af strukturen, der hvor strukturen defineres.

[8<8<8<]
> Men jo, det er jo egentlig en pointer til næste stream. Ligeledes
> er PreviousStream.

Det tænkte jeg godt -)
Jeg vil anbefale at bruge en pointer:
* du slipper for en masse cast
* du får hjælp af compilerens statiske typecheck, når du undgår castene
* du gør din kode mere robust, ved at fortælle compileren hvad du mener.
F.eks. vil din kode med 32 bit integer ikke virke, hvis du prøver at
oversætte det til en 64 bit computer
En gammel regel siger: hvis du prøver at snyde compileren skal den nok
få sin hævn


--
Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste