Eli siis tein ohjelmaani "jos" kasan, jonka tarkoitus on lisätä osakkeita pelaajalle joka ostaa niitä ja poistaa osakkeita pelaajalta joka myy niitä.
Tarkistus toimii seuraavasti selittäen:
- Tarkistetaan omistaja ja poistetaan tältä osakkeet jotka ostettiin
- Tarkistetaan ostaja ja lisätään tälle osakkeet
- Tarkistetaan elsellä että jos ostajalla ei ole jo ennestään osakkeita kyseisestä firmasta luodaan "Stocks" vectoriin kyseiselle pelaajalle tiedot, että omistaa tämän firman osakkeita näin ja näin paljon.
Ja sitten sama koodina:
std::vector<Companys::Stocks>::iterator stock2= Vekt::stocks.begin(); while(stock2 != Vekt::stocks.end()){ std::vector<Companys::AllCompanys>::iterator all= Vekt::all_companys.begin(); while(all != Vekt::all_companys.end()){ if(firma_id == stock2->MikaFirma and omistaja == stock2->Omistaja_id) { //tämä on rivi 253. stock2->Maara-=maara; } if(firma_id == stock2->MikaFirma and ostaja == stock2->Omistaja_id) { stock2->Maara+=maara; } else if (firma_id == stock2->MikaFirma and ostaja != stock2->Omistaja_id) { Vekt::stocks.push_back(Companys::Stocks(ostaja, maara, firma_id)); } all++; } stock2++; }
Kun aloitan pelin ja yritän ostaa osakkeita painan nappia "osta" missä kohtaa yläpuolella oleva funktio suoritetaan niin peli kaatuu 0x3 virheeseen.
Debuggerin tiedot ovat seuraavat:
Program received signal SIGSEGV, Segmentation fault. At C:/Users/Mika/Desktop/Peli projektit/Alpha/Business Life/data/game.hpp:253
Sitten peli ei kaadu jos otan vectori luonti mahdollisuuden else if lausekkeessa pois.
Edit: ja jos joku ihmettelee miksi "all_companys" eli kaikki firmat avataan myös whileen tuossa vaikka siitä ei oteta mitään tietoa ylös se johtuu siitä, että jahka tämän saan toimimaan otan sieltä kyseisestä vectori paikasta osakkeen hinnan ylös ja lisään ja poistan rahaa ostajalta ja ostettavalta.
Kun muutat vektorin sisältöä, vanhat iteraattorit eivät enää kelpaa. Siksi push_backia seuraavalla stock2:n käyttökerralla ohjelma kaatuu. Voit tehdä esimerkiksi näin:
int kohta = stock2 - Vekt::stocks.begin(); Vekt::stocks.push_back(Companys::Stocks(4, maara, firma_id)); stock2 = Vekt::stocks.begin() + kohta;
Epäilen kyllä, että lisäksi viritelmäsi logiikka on totaalisesti pielessä...
Ylipäänsä ei vaikuta järkevältä pitää kaikkia osaketietoja tuolla tavalla samassa vektorissa. Mikset tee jokaiselle omistajalle omaa vektoria? Tässä tapauksessa map olisi vielä parempi kuin vektori, koska sillä ei tarvitsisi käydä kaikkea läpi:
class Henkilo { std::map<int, int> omistukset; }; myyja.omistukset[firma_id] -= maara; ostaja.omistukset[firma_id] += maara;
Tai toisin päin:
class Firma { std::map<int, int> osuudet; }; firma.osuudet[myyja_id] -= maara; firma.osuudet[ostaja_id] += maara;
Kiitoksia metabolix! En muistanut mapin olemassa oloa ja helpottaa todenteolla tätä hommaa! :D
Olen ollutkin jo ihan solmussa noiden vectori pirujen kanssa kun niitä on niin paljon, mutta tuo helpottaa! Kiitos! :)
Edit:
Sellainen tässä nyt tuli kun joutuisin map toiminnan takia muuttamaan koodia melkoisen paljon, niin päätin nyt vielä koittaa vectoreilla. Antamallasi koodivinkillä sain ostettua osakkeita, mutta vain yhdestä firmasta. Jos yritän ostaa jostain muusta tapahtuu kaatuminen 0x3 virheeseen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.