Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: string structissa

kayttaja-3842 [24.09.2009 21:08:56]

#

Tervehdys kaikille,

Elikkäs jälleen probleemia minulla. Ongelmani on se, että kun luon stringin structiini, niin pelini kaatuu. Käsittääkseni vika on muistian ylittymisestä tai jostain vastaavasta tapahtumasta.

Eli kun luon näin, niin ohjelma kaatuu..

struct PlayerStats{
 string name;
 int id;
 int x;
 int y;
 int healt;
 int type;
 int team;
};

...jos taas vastaavasti otan "string name;" muuttujan poijes, niin kaikki toimii loistavati.

Onko niin, että stringi on tarkoitettu vain väliaikaisen tiedon tallentamiseen, eikä sovellu ollenkaan pitäaikaiseen tiedon tallentamiseen?

Edit1: Itse asiassa huomasin, että vaikka stringin tilalle laittas minkä tyyppisen määrittelyn vaan niin ohjelma kaatuu.

Eli jos structissa on vähemmän kuin 7 muuttuja määrittelyä, niin ohjelma ei kaadu, mutta jos laitan 7 määrittelyä niin ohjelmani kaatuu jostian syystä??? :O

Metabolix [24.09.2009 21:18:15]

#

Eli ohjelmassasi on jossain bugi.

Stringistä pitää muistaa vain, että structia ei pidä mennä kopioimaan toiseen millään memcpy-funktiolla tai vastaavalla, koska silloin tuloksena on kaksi structia, joiden string-oliot luulevat omistavansa saman muistialueen (sehän on sisäisesti char-osoitin ja pituustieto), ja kun toinen sitten vapauttaa muistinsa (tai siirtää uuteen paikkaan), ollaankin pulassa.

#include <string>
#include <cstring>

/*
// Pelkistetty versio string-luokasta:
struct string {
    char *teksti;
    unsigned int pituus;
};
*/

struct s {
    std::string x;
};
int main() {
    s a = {"a"}, b = {"b"};
    memcpy(&a, &b, sizeof(s));
    // Molemmat käyttävät tekstiä b, ja lopuksi ohjelma kaatuu,
    // kun molemmat vapauttavat saman muistin. Lisäksi a jääkin
    // vapauttamatta, koska osoitin on hukattu.
}

Jos pelissäsi on monta tiedostoa, muista aina kääntää ne kaikki uudestaan, jos jokin rakenne muuttuu. Jos ympäristö fiksusti jättää jonkin tiedoston kääntämättä, siinä oleva koodi käyttää rakennetta väärin (vanhalla tavalla).

kayttaja-3842 [24.09.2009 21:26:45]

#

Joo, aivan. Pointteri ongelma!!! Nytten toimii kiitos paljon Metabolix jälleen kerran. :)

Vastaus

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

Tietoa sivustosta