|
| Konvertering af pointere Fra : Andreas Vinther |
Dato : 27-05-07 15:02 |
|
Jeg skal have flyttet lidt rundt på nogen funktioner i et af mine
tidligere programmer.
Jeg vil helst undgå at lave det hele om og har derfor et spørgsmål.
Lad os forestille os en situation hvor følgende pointere eksiterer:
char ***pppValues;
char **ppValues;
Desuden gælder der, at:
ppValues = *pppValues;
Nu ønsker jeg at omskrive følgende udtryk:
ppValues[index]
Således at jeg stadig har samme værdi, men anvender pppValues istedet
for ppValues.
Jeg har prøvet følgende uden held (jeg ved godt at nogen er lidt ude i
skoven, men jeg har taget dem med for helhedens skyld)
*pppValues[index]
*(pppValues[index])
*(pppValues)[index]
*((pppValues)[index])
(*pppValues)[index]
*((*pppValues)+index)
Ingen af ovenstående giver mig det rette resultat.
Jeg plejer ikke at have problemer med konvertering af mine pointere, men
jeg er rimelig træt og har lidt svært ved at tænke lige.
Jeg vil blive rigtig glad hvis en eller anden gider give mig det rigtige
omskrivning vil jeg være meget taknemmelig. Og hvis du er rigtig sej, så
vil jeg meget gerne have konverteret følgende udtryk ud fra samme
fremgangsmåde:
*(unsigned long *)ppValues[index]
På forhånd mange tak
/Andreas Vinther
| |
Igor V. Rafienko (27-05-2007)
| Kommentar Fra : Igor V. Rafienko |
Dato : 27-05-07 15:37 |
|
[ Andreas Vinther ]
[ ... ]
> Lad os forestille os en situation hvor følgende pointere eksiterer:
>
> char ***pppValues;
> char **ppValues;
>
> Desuden gælder der, at:
>
> ppValues = *pppValues;
>
> Nu ønsker jeg at omskrive følgende udtryk:
>
> ppValues[index]
(*pppValues)[index]
Indekseringsoperatoren har høyere presedens enn dereference. Ergo
er det nødvendig med ()-rundt.
[ ... ]
> Jeg har prøvet følgende uden held (jeg ved godt at nogen er
> lidt ude i skoven, men jeg har taget dem med for helhedens skyld)
>
> *pppValues[index]
> *(pppValues[index])
Disse betyr det samme -- pppValues[index] (som er en char**) som du
så derefererer og får en char* ut av.
> *(pppValues)[index]
> *((pppValues)[index])
Disse to er ekvivalente, og betyr det samme som koden over.
> (*pppValues)[index]
Dette er den rette.
> *((*pppValues)+index)
Ugh.
> Ingen af ovenstående giver mig det rette resultat.
Nå ja, da får du vel vise litt mer av konteksten:
int
main( int argc, char *argv[] )
{
char something[] = "a quick brown fox jumps over a lazy dog";
char *sp = something;
char **spp = &sp;
char ***sppp = &spp;
puts(spp[0]);
puts((*sppp)[0]);
}
Mitt tips er ddd med dens displayfunksjon (evt. et passende verktøy
for windows). Det du trenger er å få vist frem adressene som de
forskjellige pekere har.
Er du sikker på at pekerfeilen ikke ligger et annet sted? Hva slags
resultat er det du ønsker, og hva slags resultat er det du får?
> Jeg vil blive rigtig glad hvis en eller anden gider give mig det
> rigtige omskrivning vil jeg være meget taknemmelig. Og hvis du er
> rigtig sej, så vil jeg meget gerne have konverteret følgende
> udtryk ud fra samme fremgangsmåde:
>
> *(unsigned long *)ppValues[index]
Dette uttrykket er ikke garantert til å virke, avhengig av index og
arkitekturen. Man har ikke lov til å konvertere ukritisk en char*
til en unsigned long* (T* -> char*/void* -> T* er lov, men det er
omtrent det eneste).
ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
-- Fry, "When aliens attack"
| |
Andreas Vinther (27-05-2007)
| Kommentar Fra : Andreas Vinther |
Dato : 27-05-07 16:27 |
|
Undskyld... Jeg er vist lidt for træt. Jeg var kommet til samme
konklusion som dig, men kunne ikke få det rigtige resultat. Nu har jeg i
mellemtiden fundet min fejl. Jeg ændrede index imellem de to kald som
skulle være ens.
Men mange tak for din hjælp. Det gjorde at jeg stolede lidt mere på mig
selv og begyndte at lede (og fandt fejlen) et andet sted i koden.
Mvh
Andreas Vinther
----------- snip snip snip --------------------
| |
|
|