Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: pikaista apua merkkijonon palautukseen

Sivun loppuun

DumTom [14.11.2011 08:40:30]

#

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?

Pekka Karjalainen [14.11.2011 09:29:22]

#

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.

DumTom [14.11.2011 14:59:07]

#

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?

Hennkka [14.11.2011 15:38:53]

#

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.

Pekka Karjalainen [14.11.2011 15:56:18]

#

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.

DumTom [14.11.2011 15:58:58]

#

mielestäni muutan osoittimen char *back osoittamaa tietoa strcpy:llä ja strcat:illa.

DumTom [14.11.2011 16:10:35]

#

Sain toimimaan. Kiitos Pekka ja Henkka.

JaskaP [14.11.2011 17:31:09]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta