Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: string chariksi c++

Sivun loppuun

Axuu [03.05.2006 10:19:03]

#

Tarvitisi saada string muotoinen merkkijono muuettua char* taulukoksi, miten tämä onnistuisi?

sooda [03.05.2006 10:39:38]

#

Jos chartaulukkoa ei tarvitse muuttaa, niin munstringi.c_str(). Jos sillä pitää pelleillä, niin tee stringisi pituinen chartaulukko ja kopioi tuosta c_str():stä sisältö siihen.

Blaze [03.05.2006 10:40:41]

#

Std::Stringin c_str-metodilla.

Edit: Höh, hidas.

koo [03.05.2006 11:28:54]

#

sooda kirjoitti:

Jos sillä pitää pelleillä, niin tee stringisi pituinen chartaulukko ja kopioi tuosta c_str():stä sisältö siihen.

Näinhän se on, mutta lisäisin vielä, että jos taulukko pitää ihan erikseen tehdä, kannattaa käyttää vectoria. Voisi olla hyvä myös katsoa, mitä stringin omalla copy- tai standardikirjaston copy-funktioilla saa aikaiseksi.

Axuu [03.05.2006 11:45:29]

#

functiot.cpp:312: error: invalid conversion from `const char*' to `char*'
functiot.cpp:312: error: initializing argument 1 of `int BuildTexture(char*, GLuint&)'

totaah tollast se valittaa, laitoin tuon siis toiseen functioon meneväks:

string polku="/tiedostot/kuvat/kortit/pakka1/h10.bmp";

if (!BuildTexture(polku.c_str(),  textureKortti))
		return false;

Metabolix [03.05.2006 13:25:22]

#

Muuta funktion määrittelyyn char*:n paikalle const char*.

koo, vector tuskin kelpaa char-tauluksi yhtään stringiä paremmin. Kyse oli siis stringin muuttamisesta C-tyyliseksi.

koo [03.05.2006 16:44:46]

#

Joo, pulma on melko varmasti siinä, että tuo funktio on määritelty ottamaan char *, vaikkei se todennäköisesti edes aio muuttaa saamaansa parametria. Näitä virheitä on tämän tästä C-rajapinnoissa ja ne vähän kiusaavat C++-koodareita, jotka ovat usein kiinnostuneempia tekemään koodia, joka on const correct. Looginen virhe siis.

Axuu, et taida päästä muuttamaan tuota funktion määrittelyä/toteutusta? Silloin on kaksi vaihtoehtoa: Jos tiedät, ettei funktio muuta parametrina saamaansa taulukkoa, tee näin:

BuildTexture(const_cast<char *>(polku.c_str()),  textureKortti)

Rumaa, mutta toimii, jos tuon polun täytyy kumminkin muutoin olla string. Toinen vaihtoehto on sitten se, että luo sen erillisen merkkitaulukon vaikka näin:

std::vector<char> tmp(polku.begin(), polku.end());
tmp.push_back(’\0);
BuildTexture(&tmp[0],  textureKortti)

Metabolix, kyllä vector kelpaa oikein hyvin, se on ihan tarkoituksella yhteensopiva C-tyylisten taulukoiden kanssa. Varsinkin, jos taulukko täytyy luoda dynaamisesti, silloin tulee mm. exception safety ja vähän muutakin kaupanpäällisinä. Ja suorituskyvynkin saa lopulta pidettyä ihan yhtä hyvänä.

Metabolix [03.05.2006 17:05:34]

#

koo, mutta sitäpä ei silti voi syöttää C:n funktioille char*:n sijaan, vai kuinka? Korjaa toki, jos erehdyn.

koo [04.05.2006 09:44:55]

#

Metabolix kirjoitti:

sitäpä ei silti voi syöttää C:n funktioille char*:n sijaan

Ei niin sellaisenaan, mutta sanomalla &vektori[0] pääsee kyllä tosi lähelle. Tämä ei ole edes mikään kikka, vaan nuin se on ihan vasiten standardoitu.


Sivun alkuun

Vastaus

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

Tietoa sivustosta