[C / C++]Geheugenadres manipulatie

Pagina: 1
Acties:

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 26-08 21:50
Ik heb een eigen programma die schrijft naar een file met de functie fwrite. na zo'n functie wordt de automatisch de pointer in de file opgehoogd. Nu herschrijf ik dit gedeelte naar een memcopy. Nadat er 20 memcpy's gedaan zijn wil ik al de gekopieerde data in 1 keer wegschrijven met een fwrite.

Het probleem zit erin dat het adres waar geschreven wordt in het geheugen niet opschuift automatisch. Hierdoor schijf ik telkens over het vorige stuk heen ipv erachteraan. Dus dacht ik dan doe ik dat zelf even. Alleen als ik kijk tijdens het debuggen zie je de void* niet opschuiven. Hebben jullie een verklaring hiervoor?

De manier hoe het was is zo:
nitems = fwrite((uint8 *)buffer, sizeof(uint32), (ptr->currword + 1), bbPtr->filePtr);

Wat ik nu zelf geschreven heb al vervanger daarvan is dit.
memcpy(bbPtr->voidPtr, buffer, ptr->currword + 1);
*(char far*)bbPtr->voidPtr += (ptr->currword + 1) * 32;

Na de laatste actie blijft de bbPtr nog steeds naar het zelfde geheugenadres pointen.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 12:32

johnwoo

3S-GTE

*(char far*)bbPtr->voidPtr += (ptr->currword + 1) * 32;
Je bent niet de pointer aan het verleggen, maar de waarde op het adres waar ie naar toe wijst aan het veranderen. De eerste * dereferencet je (naar char far* gecaste) pointer voidPtr. Probeer het eens zonder die *

C:
1
bbPtr->voidPtr += (ptr->currword + 1) * 32;

[ Voor 28% gewijzigd door johnwoo op 03-12-2002 09:39 ]

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 26-08 21:50
johnwoo schreef op 03 december 2002 @ 09:36:
[...]

Je bent niet de pointer aan het verleggen, maar de waarde op het adres waar ie naar toe wijst aan het veranderen. De eerste * dereferencet je (naar char far* gecaste) pointer voidPtr. Probeer eens gewoon

C:
1
bbPtr->voidPtr += (ptr->currword + 1) * 32;
Dat dacht ik in eerste instantie ook maar dat mag niet. Je mag niet bij een void* zomaar een integer optellen. Dat krijg je deze melding
c:\1\grabit\bitio.c(635) : error C2036: 'void *' : unknown size.


STOM STOM STOM. Nu zie ik het pas het is gewoon

(char far*)bbPtr->voidPtr += (ptr->currword + 1) * 32;