Koodi on lyhennettynä tässä:
char * MakeHighScoreString(short pos,const char * who,long score,short lev) { char koko[50],numero[20],nimi[12],apu[50]; char * palautus; strcpy(koko,"jotain"); strcpy(palautus,koko); return *koko; }
|1264|error: invalid conversion from 'char' to 'char*'|
Ja virhe yläpuolella.
Olen kokeillut vaikka mitä mutta mikään ei auta,miten siis toimin?
Jos haluat rakentaa char-taulukkoon tekstitietoa, on hyvä tapa varata tämä taulukko erikseen muualla ja välittää funktiolle parametrinä osoitin siihen. Tällöin taulukko on olemassa myös sen jälkeen, kun funktion suoritus loppuu.
Esimerkissäsi taulukko koko
on paikallinen muuttuja. Se lakkaa olemasta funktion loputtua, joten osoittimen palauttaminen siihen ja sen käyttäminen sen jälkeen on virhe. Osoitinhan osoittaa johonkin, jota ei ole enää olemassa. Kääntäjäsi luultavasti varoittaa tästä, jos asetat varoitusasetukset päälle.
Näyttämäsi virheilmoituksen voit poistaa, jos otat *-operaattorin pois return-riviltä. Tämä ei kuitenkaan korjaa ym. virhettä.
Jos käytät C++-kieltä, pääset helpommalla käyttämällä string-luokkaa. Näkyvyyssäännöt, muuttujien elinaika ja osoittimet syntakseineen taas pitää opetella kunnolla. Ei niihin voi antaa pikaista apua.
char *riimu; riimu=MakeHighScoreString(1,"NO ONE ",10,4,riimu); DrawText(ax,ay,riimu,0);ay+=50; char * MakeHighScoreString(short pos,const char * who,long score,short lev,char *back) { char numero[7],nimi[12],apu[20]; strcpy(back,"1ST "); strcat(back,who); return back; }
Mikäs tässä mättää?
Pitääkö varata muistia esittelyssä char *riimu; ?
Lähetänkö osoittimen oikein?
DumTom kirjoitti:
Pitääkö varata muistia esittelyssä char *riimu; ?
Kyllä pitäisi.
DumTom kirjoitti:
Lähetänkö osoittimen oikein?
Lähetät kyllä oikein, mutta onko sen palauttamisessa mitään järkeä? Funktio ottaa sisään osoittimen riimuun ja palauttaa saman osoittimen muuttumattomana, ja korvaat vielä riimun sillä. Fiksumpaa on yleensä palauttaa joko bool
tai int
, joka kertoo, onnistuko funktion suoritus.
En halua lisätä paljon Hennkkan vastaukseen, mutta yksi asia on mielessä. Koska kyseessä on ennätystaulukko, voi sen vaatiman muistin mielestäni varata myös globaalisti. Globaaleista muuttujista yleensä varoitellaan, ja on siihen hyviäkin syitä, mutta tässä tapauksessa sinulla on varmaankin koko pelissä vain yksi tällainen taulukko. Tuskinpa sen laittaminen globaaliksi aiheuttaa kovin paljon ongelmia. (Siihen osoittavien osoittimien ei tarvitse puolestaan olla globaaleja muuttujia.)
Toki muukin tapa varata muistia käy.
mielestäni muutan osoittimen char *back osoittamaa tietoa strcpy:llä ja strcat:illa.
Sain toimimaan. Kiitos Pekka ja Henkka.
Pekka Karjalainen kirjoitti:
Koska kyseessä on ennätystaulukko, voi sen vaatiman muistin mielestäni varata myös globaalisti. Globaaleista muuttujista yleensä varoitellaan, ja on siihen hyviäkin syitä, mutta tässä tapauksessa sinulla on varmaankin koko pelissä vain yksi tällainen taulukko.
Joo, C:ssä globaalien käyttöä ei katsota pahalla. Ja jos vielä käyttää "semi"globaaleja static-määreellä niin vielä parempi.
Funktioiden ulkopuolella static-määritelty näkyy vain ko. tiedoston sisäisessä koodissa:
static int *not_so_global; static void my_private_func();
Muistaakseni Minixin koodissa oli määritelty makrot:
#define PUBLIC #define PRIVATE static
Mikä ehkä selventää ideaa.
DumTom, opettele kunnolla C:n osoittimet, taulukot ja muistinvaraus (+ näkyvyysalue) ettei tarvitse kysellä tuommoisia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.