Tarvitisi saada string muotoinen merkkijono muuettua char* taulukoksi, miten tämä onnistuisi?
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.
Std::Stringin c_str-metodilla.
Edit: Höh, hidas.
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ää vector
ia. Voisi olla hyvä myös katsoa, mitä stringin omalla copy
- tai standardikirjaston copy
-funktioilla saa aikaiseksi.
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;
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.
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ä.
koo, mutta sitäpä ei silti voi syöttää C:n funktioille char*:n sijaan, vai kuinka? Korjaa toki, jos erehdyn.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.