Avatar billede narrr Nybegynder
12. april 2003 - 02:26 Der er 16 kommentarer og
1 løsning

Hvad mon...

Hvad gør denne linie egentlig?? Jeg kan forstå, at den får Pointer til at pege på noget, men jeg er ikke helt med på hvad der sker med det cast.

unsigned char bufferz[2100];
SomeStruct *Pointer = (SomeStruct *)bufferz;
Avatar billede narrr Nybegynder
12. april 2003 - 02:29 #1
Og kan man evt. lave noget tilsvarende med new ?
Avatar billede arne_v Ekspert
12. april 2003 - 07:54 #2
unsigned char bufferz[2100];

allokerer et array af 2100 char uden at initalisere det.

SomeStruct *Pointer = (SomeStruct *)bufferz;

allokerer en pointer til SomeStruct og initialiserer den til
at pege på char arrayet.

Når man så laver:
  Pointer->felt1 = 1;
  Pointer->felt2 = 2;
  Pointer->felt3 = 3;

Så initialiserer man det Pointer peger på nemlig char arrayet.
Avatar billede arne_v Ekspert
12. april 2003 - 07:55 #3
Ja, man kan også lave:

char* bufferz = new char[2100];
SomeStruct *Pointer = (SomeStruct *)bufferz;
Avatar billede narrr Nybegynder
12. april 2003 - 11:58 #4
Jow, men jeg tænkte på, om man kunne erstatte SomeStruct *Pointer = (SomeStruct *)bufferz; med new et-eller-andet ?
Avatar billede twm Nybegynder
12. april 2003 - 12:03 #5
new bruger du kun når du skal allokerer ny plads, medmindre at du ønsker at lave en kopi af nogle data!
Ved dit eksempel type caster du dig frem til at ændre din char* pointer til at være af typen SomeStruct* derfor opstår der ikke nye data.
Avatar billede narrr Nybegynder
12. april 2003 - 12:23 #6
Hvis vi nu ser helt bort fra bufferz, kan man så ikke bruge new til at gøre det samme som man gør med Pointer = (SomeStruct *)bufferz ? Jeg ved godt at der ikke bliver allokeret hukommelse her. noget i retning af Pointer = new SomeStruct[2100] eller er det ikke det samme ?
Avatar billede arne_v Ekspert
12. april 2003 - 12:29 #7
Nej - det er noget helt andet.

Der allokerer man 2100 nye SomeStruct.
Avatar billede twm Nybegynder
12. april 2003 - 12:30 #8
SomeStruct *Pointer = new SomeStruct[2100];
Gør "næsten" det samme, den ene opretter bare på heapen og den anden på stacken.
Derfor er du nød til hvis du har brugt new, at slette pladsen igen:
delete Pointer;

Den anden slettes automatisk, når den løber ud af scope.
Avatar billede arne_v Ekspert
12. april 2003 - 12:36 #9
twm>

Det mener du ikke.

SomeStruct *Pointer = (SomeStruct *)bufferz;

Opretter aldrig noget som helst (jo en pointer men det ikke pointen)
og det den pointer peger på kan både ligge i heap eller på stak
(afhængig af hvor bufferz er erklæret).

Og:
  new SomeStruct[2100]
allokerer ikke 2100 bytes men 2100*sizeof(SomeStruct) bytes.
Avatar billede narrr Nybegynder
12. april 2003 - 12:42 #10
Hvad så med Pointer = new SomeStruct[2100/sizeof(SomeStruct)] ??
Avatar billede arne_v Ekspert
12. april 2003 - 12:44 #11
Hvis sizeof(SomeStruct) går op i 2100, så vil den allokere 2100 bytes.
Avatar billede arne_v Ekspert
12. april 2003 - 12:47 #12
Men altså det den konstruktion ofte bruges til er noget helt andet.

Man har typisk en klump data læst op i et char array.

Inde i den klump data er der så nogle data-strukturer og
når man skal have fat i dem, så laver man det her nummer:

char bigbuf[100000];
SomeStruct1* p1 = (SomeStruct1*)bigbuf;
SomeStruct2* p2 = (SomeStruct2*)(bigbuf+p1->record_length);
etc.
Avatar billede twm Nybegynder
12. april 2003 - 12:52 #13
Hvis den feks fyldte 10 byte ville den allokere plads til 210 somestruct og ikke bytes!
;)
Avatar billede narrr Nybegynder
12. april 2003 - 13:15 #14
Okay, fint nok
Avatar billede narrr Nybegynder
12. april 2003 - 13:17 #15
Så er der altså ikke noget alternativ til Pointer = (SomeStruct *)bufferz ?
Avatar billede arne_v Ekspert
12. april 2003 - 13:21 #16
Ikke umiddelbart.

Det er muligt at du kan ændre noget i den overordnede logik.

Hvor du i.s.f. at læse ind i et char array og så ligge en struct
ind over det bagefter kan læse direkte ind i en struct.

Men det er den overordnede struktur i dit program.
Avatar billede narrr Nybegynder
12. april 2003 - 14:17 #17
Okay, jeg takker.
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