Moi, olen tainnut ymmärtää jotain C:n alkeista väärin, koska kun loin tällaisen funktion:
void a(int *x, int *y) { . . . jos painetaan nappia oikealle *x++ jos painetaan nappia vasemmalle *x-- jos painetaan nappia alas *y++ jos painetaan nappia ylös *y-- . . . }
...tuli x:n ja y:n arvoiksi aivan kummalliset tulokset. Niiden pitäisi kasvaa vain yhdellä, mutta esimerkiksi x kasvoi sadasta 10500:aan.
Mikä vika? Olen kenties käsittänyt muuttuvien muuttujien lähettämisen funktioille väärin.
Tee arvojen kasvatus ja vähennys näin:
(*x)++
Tällöin viitataan nimenomaan muuttujaan, johon x osoittaa. Alkuperäisessä koodissasi *x++ kasvatetaan osoitinta x eikä arvoa *x.
Ongelmasi on operaattoreiden suoritusjärjestyksessä. Koska ++
suoritetaan ennen *
-operaattoria, lopputulos vastaa lausetta *(x++)
, toisin sanoen osoitin siirtyy yhdellä ja arvolle ei tehdä mitään. Kääntäjä varoittaakin (-Wall
-lipun kanssa), että *
-operaattorin tuottamaa arvoa ei käytetä missään.
Voit joko lisätä sulut, (*x)++
, tai siirtyä edeltävään ++-operaattoriin, ++*x
.
*x++; ja (*x)++; on eri asioita. Ensimmäinen muuttaa paikkaa, johon pointteri osoittaa, jälkimmäinen arvoa.
Edit: ohhoh, jopas olin hidas :E
Varmaan tuli jo selväksi, että ongelma johtuu siitä, että nuo operaattorit suoritetaan eri järjestyksessä kuin mitä kuviteltiin. Postfix-++ on siitä vähän hankala, että vaikka se tehdään ensiksi, sen vaikutukset näkyvät vasta lopuksi. Ehkä näitä juttuja havainnollistaa, jos kirjoitetaan pari esimerkkiä auki.
/* a = ++*x; on loogisesti sama kuin */ *x = *x + 1; /* kasvatetaan arvoa */ a = *x; /* a = *++x; on loogisesti sama kuin */ x = x + 1; /*siirretään osoitinta eteenpäin */ a = *x; /* a = *x++; on loogisesti sama kuin */ __tmp = x; /* vanha osoitin talteen */ x = x + 1; /* siirretään osoitinta eteenpäin */ a = *__tmp; /* arvo vanhasta paikasta */
Asiaan siis vaikuttaa operator precedence, associativity ja vähän sekin, mitä operaattorin on tarkoitus tehdä. Esimerkiksi noihin post-incrementiin ja post-decrementiin liittyy aina jonkinlainen arvon kopiointi, jonka kääntäjä voi joskus optimoida pois.
Aihe on jo aika vanha, joten et voi enää vastata siihen.