Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Random funktio

Sivun loppuun

mika132 [02.08.2010 17:44:22]

#

Voisiko joku kertoa minulle miten oikeasti tuo random funktio toimii. Itselläni se heittää randomina valittavat hahmot noin 1-10 pisteen sisälle vaikka tarkoitus olisi saada 1-600 sisälle nuo. Eli tässä tilanne:

int x_place = rand() % 600 + 1;
int y_place = rand() % 600 + 1;

Minulla ei nimittäin ole mitään tietoa miten tuo random toimii. Katsoin vain C++ oppaasta jonka googlella löysin ja päättelin, että se katsoo jotenkin prosentuaalisesti, mutta ei voi katsoa, kun kaikki 8 randomilla määrättävää hahmoa menee pienelle alueelle.

pake10 [02.08.2010 17:56:30]

#

Ainakin minulla luku oli 1:n ja 600:n väliltä kun CodePadilla testasin.

Milo [02.08.2010 18:23:20]

#

Mitä jos lukisit man rand ?
Esimerkissä kerrotaan, että ensin määritellään randomille seed srand() funktiolla. hyvä seed on esimerkiksi timestä saatu. Esim siis näin:
srand(time(NULL));

lukualue rajoitetaan modulo-operaatiolla, mikäli modulo-operaatio ei ole tuttu, lue sen toiminta minkä tahansa kielen oppaasta, toimii kaikissa kielissä samalla tavalla. rand() palauttaa satunnaisen luvun, joka sinun täytyy itse moduloida oikeaan lukualueeseen.

mika132 [02.08.2010 18:45:56]

#

Okei. Tutustuin moduloon ja kirjoitin lähdekoodiin random arvojen tulostuksia konsoliin. No luku muuttuu nyt, mutta en tiedä sitten sitä, että miksi se tallentaa sen Siviilin muuttujaan x ja y arvona 10 molempiin joka kerta vaikka random luku x_place ja y_place antavat 400 yms lukuja kuten pitääkin. En keksi enää muuta kuin, että näytän koko funktion, että teenkös jotain väärin.

peli::Siviili peli::uusi_siviili() {
    int x_place, y_place;
    Siviili s;
    Pelaaja p;
    for (int i=0; i <= p.asukkaita; i++)
    {
        srand(time(NULL));
        x_place = rand() % 600 + 1;
        y_place = rand() % 600 + 1;
        std::clog << x_place<< "|" << y_place << std::endl;
        s.rahaa[i]=400;
        s.tyota[i]=1;
        s.ika[i]=22;
        s.mieliala[i]=100;
        s.tyytyvaisyys_johtajaan[i]=100;
        s.palkka[i]=1500;
        s.asiaa[i]=1;
        s.ID[i]=1;
        s.asuin_data[i]=1;
        s.x[i]=x_place;
        s.y[i]=y_place;
        std::clog << s.x[i]<< "|" << s.y[i] << std::endl; //tässäkin arvo kertoo vielä, että oikein mennään
        s.arvonimi[i]=1;
        return s;
    }
}

mutta kun siirrytään piirtämään niin luku on ihan jokin muu.

for (int i=0; i<=p.asukkaita; i++) {
    piirra_kuva(kuva::siviili, s.x[i], s.y[i]);
    std::clog << s.x[i]<< "|" << s.y[i] << std::endl; //se näyttää molempiin 10|10
}

Milo [02.08.2010 19:20:11]

#

Miksi teet loopin jos returnaat loopin lopussa? Mikä on p.asukkaita arvo? Eli mikä tulee Pelaaja-luokan asukkaita-muuttujan arvoksi konstruktorin jälkeen?

Random seedi tarvitsee asettaa vain kerran, jossain ennen kuin sitä käytetään ensimmäistä kertaa. Ei ole tarkoitus loopata, jos loopissa asettelet seedin joka kerta, niin ei ole kovinkaan epätodennäköistä, että saat viidellä sadalla kierroksella täsmälleen samat satunnaisluvut.

mika132 [02.08.2010 19:43:48]

#

Siksi teen loopin koska siviileitä on tarkoitus olla yhtäpaljon kuin asukkaita. (tietenkin suhteessa, että ei nyt ihan miljoonaa siviiliä jos asukkaita on miljoona) mutta takaisin asiaan. Miten se sitten pitäisi muka tehdä?

p.asukkaita arvo on 4. Jopa tarkistuksen tein konsoliin niin se on neljä. Alkuperäsesti oli 8, mutta muutin sen neljään.

Siltikin se pistää kaikki samaan pisteeseen.

Chiman [02.08.2010 20:36:24]

#

Kutsu srandia kerran koko ohjelman alussa, se riittää. Ja siirrä return for-silmukan ulkopuolelle, niin että silmukkaa oikeasti suoritetaan monta kierrosta eikä return keskeytä sitä heti ekan kerran lopussa.

mika132 [02.08.2010 20:51:38]

#

Ei. En käsitä missä vika. Nyt kerron ensin koodin ja sen jälkeen mitä tuo tulosti konsoliin, mutta siviili on nyt pisteessä (1,1)

peli::Siviili peli::uusi_siviili(Pelaaja const& p) {
    int x_place, y_place;
    Siviili s;
    srand(time(NULL));
    std::clog << "Asukkaita: " << p.asukkaita << std::endl;
    for (int i=0; i <= p.asukkaita; i++)
    {
        x_place = rand() % 600 + 1;
        y_place = rand() % 600 + 1;
        std::clog << "X ja Y" << x_place<< "|" << y_place << std::endl; //eka tulostin
        s.rahaa[i]=400;
        s.tyota[i]=1;
        s.ika[i]=22;
        s.mieliala[i]=100;
        s.tyytyvaisyys_johtajaan[i]=100;
        s.palkka[i]=1500;
        s.asiaa[i]=1;
        s.ID[i]=1;
        s.asuin_data[i]=1;
        s.x[i]=x_place;
        s.y[i]=y_place;
        std::clog << s.x[i]<< "|" << s.y[i] << std::endl; //toka tulostin
        s.arvonimi[i]=1;
    }
    return s;
}

sitten konsolin tekstit.

//ekan tulostimen tulostukset (siis nuo tulostukset menevät oikeasti joka toinen mutta ajattelin että pysyy selvempänä näin)

67|288
98|355
25|165
67|254

//toka tulostukset eli nuo s.x ja s.y
288|288
355|355
165|165
254|254

Eli pelaajan x ja y ovat tismalleen sama, mutta silti niiden arvo on jotain muuta kuin 1,1 mihin tällä hetkellä siviili menee.

Annan vielä tuon koko piirtofunktion.

void ohjelma::piirra_peli(peli::Pelaaja const& p, peli::Siviili const& s) {
    if (p.room==1)
    {
        piirra_kuva(kuvat::peli_kartta, 0, 0);
        for (int i=0; i<=p.asukkaita; i++) {
            piirra_kuva(kuvat::siviili, s.x[i], s.y[i]);
        }
        piirra_kuva(kuvat::peli_ala_valikko, 0, 0); //ei tarvi välittää

        int napit, xx, yy; //tuli osittai vahinkos kaks x mut ei tartte välittää
        napit=SDL_GetMouseState(&xx, &yy);
/*if jutuis on siks määritetty suoraa 1 eikä etitä mistää muualta ko tarkotus oli testata et löytääks ees tota ja se löytää. Se piirtää kyl ko menee siviilin päälle ni ton tietopalkin (ja se on taas semmonen minkä ei pitäs vaikuttaa millää taval tähä ite juttuu*/
        if (yy >= s.y[1] && yy <= s.y[1]+40)
        {
            if (xx >= s.x[1] && xx <= s.x[1]+40)
            {
                    ohjelma::PiirraTietoPalkki(s);
            }
        }

    }
}

Metabolix [02.08.2010 20:54:56]

#

Toivottavasti tajuat, että rakenne peli::Siviili kuvaa loogisesti tasan yhtä siviiliä. Sinun kuuluisi tehdä taulukollinen siviilejä, ei siviilin sisään taulukollista arvoja. Samasta asiasta on muistaakseni ollut puhetta jo aiemminkin melko pitkästi.

mika132 [02.08.2010 21:10:16]

#

Ainiiiin! Toimiikos tuo systeemi jos teen sen samalla tavalla kuin matopelin jaoke systeemi?

mika132 [02.08.2010 23:03:02]

#

Nyt sain koodin kyllä niin pahasti solmuun, että tulee ainakin päivän korjaus, mutta siis pakko kysyä, ettei enempää sotkeennu koodi. =)

Mitä tässä nuo nena, nenampi jne ovat. (matopelin koodi)

for (peli::mato::jaoke *j = mato.hanta; j != 0; j = j->nenampi) {
	piirra_kuva(kuvat::matopallo, keski_x + yksikko_x * j->x, keski_y + yksikko_y * j->y, true);
}

En vain ymmärrä mihin ne muka tallentuvat ne siviilit matopelin tyylillä. Miten voin ettiä jotain tiettyä siviiliä sieltä jne.

Esim ajattelin, että tuolla tyylillä ilmeisesti siivili tehdään näin.

void peli::TeeSiviili(Pelaaja& p) {
    int x_placee, y_placee;
    srand(time(NULL));
    std::clog << "Asukkaita: " << p.asukkaita << std::endl;
    x_placee = rand() % 600 + 1;
    y_placee = rand() % 600 + 1;
    Hahmo::Siviili *s = new Hahmo::Siviili;
    s.x = x_placee;
    s.y = y_placee;
    s.rahaa=400;
    s.tyota=1;
    s.ika=22;
    s.mieliala=100;
    s.tyytyvaisyys_johtajaan=100;
    s.palkka=1500;
    s.asiaa=1;
    s.ID=1;
    s.asuin_data=1;
    s.arvonimi=1;
}

ja tuossa ID kuvastaisi jollain tavalla sitä, mitä etitään jos jonun siviilin päälle laitetaan hiiri järjestelmä katsoo x,y akselit ja sitten id:stä ketä siinä x,y:ssä on ja heittää kyseisen hahmon tiedot näkyviin, mutta oma lokiikkani sanoo, että nyt mennään ja lujaa metsään.

vehkis91 [03.08.2010 00:32:37]

#

Mikset voi vaan laittaa niitä siviileitä vectoriin tai normi taulukkoo?

mika132 [03.08.2010 00:41:27]

#

Muuta kyllä, mut en osaa käyttää vectoreita. Ja eiks toi nyt ollu aikalailla normaalina taulukkona vai tarkotaks, et ilman et siel välisä on olio?

Milo [03.08.2010 08:51:18]

#

Googleen hakusanaksi STL vector, luulis löytyvän standardikirjaston ohjesivustot, hyvine esimerkkeineen. Ohjelmointi on suurimmaksi osaksi päättelyä ja opitun ja haetun soveltamista. Mikäli standardikirjaston esiin kaivaminen tuottaa jo noin ppaljon ongelmia, niin onkohan syytä palata alkeiskurssin asioihin ja lukea huolella tutoriaaleja ennen kuin kirjoittaa riviäkään koodia.

mika132 [03.08.2010 13:22:57]

#

Kaikki näyttäisi muuten menneen hyvin, mutta ongelma on, että järjestelmä ei ymmärrä mitä tarkoitan, koska minä en ymmärrä järjestelmää. (suomeksi) Miten ihmeessä vectori tehdään funktio kutsuun kun olio tehdään.

static Siviili LuoSiviili();


niin mites vectori, kun yritin jo:

static peli::Hahmot LuodaanPelaajat(peli::Pelaaja const& p);
//toinen yritys
std::vector<peli::Hahmot> LuodaanPelaajat(peli::Pelaaja const& p);



//Tässä itse funktio
std::vector<peli::Hahmot> LuodaanPelaajat(peli::Pelaaja const& p) {
    std::vector<peli::Hahmot> s;
    int x_place, y_place;
    srand(time(NULL));
    x_place = rand() % 600 + 1;
    y_place = rand() % 600 + 1;
    for (short int a = 0; a < p.asukkaita; a++)
    {
        s.push_back(peli::Hahmot::Siviilit(4000, 1, 22, 100, 100, 1500, 1, 1, 1, x_place, y_place, 1));
    }

    std::ofstream fout("data/player.dat", std::ios::out);

    if(fout)
    {
        std::cout << "Tallenna() TOIMII!!" << std::endl;

        for(unsigned short int i = 0; i < p.size(); i++)
            fout<<s[i].rahaa << s[i].tyota << s[i].ika<<std::endl;
    }
    fout.close();

    return s;

}



//Sitten vielä tämä missä se kutsutaan.

	ohjelma::LuodaanPelaajat(p);

E: ja muuten se errori.
error: 'peli::Hahmot ohjelma::LuodaanPelaajat(const peli::Pelaaja&)' used but never defined

Macro [03.08.2010 13:32:46]

#

Eli käytät sitä ennen kuin se on määritelty.

mika132 [03.08.2010 17:18:08]

#

hmm.. Juu huomasin saman. Laitoin sen ajatuksissa väärään tiedostoon. :)


Mutta tälläinen probleema on ollut viimeisen tunnin.

Seuraava koodi nivaska heittää errorin.
error: cannot call member function `void peli::Hahmot::Siviilit(int, int, int, int, int, int, int, int, int, int, int, int)' without object


Eli se ei voi avata tuota funktiota ilmeisesti ilman objektia, mutta eikös se ole siihen lisättynä? Vai olenko nyt hieman hukassa?

//Tässä on tuo kohta jossa funktiota kutsutaan
for (short int a = 0; a < p.asukkaita; a++)
{
    s.push_back(peli::Hahmot::Siviilit(4000, 1, 22, 100, 100, 1500, 1, 1, 1, x_place, y_place, 1));
}




//ja tässä on tuo helahoito mikä on namespace peli sisällä.

    struct Hahmot {
 		int rahaa, tyota, ika, mieliala, tyytyvaisyys_johtajaan, palkka, asiaa, ID, asuin_data, x, y, arvonimi;
        float size;
        void Siviilit(int rahaa, int tyota, int ika, int mieliala, int tyytyvaisyys_johtajaan, int palkka, int asiaa, int ID, int asuin_data, int x, int y, int arvonimi)
        {
            this->rahaa = rahaa;
            this->tyota = tyota;
            this->ika = ika;
            this->tyytyvaisyys_johtajaan = tyytyvaisyys_johtajaan;
            this->palkka = palkka;
            this->asiaa = asiaa;
            this->ID = ID;
            this->asuin_data = asuin_data;
            this->x = x;
            this->y = y;
            this->arvonimi = arvonimi;
        };
    };

trilog [03.08.2010 18:01:01]

#

Yrität kutsua ei-staattista jäsenfunktiota staattisesti. Lisäksi, yrität tunkea vektoriin void-funktion paluuarvoa.

Milo [03.08.2010 18:02:02]

#

Eikös tuosta virheilmoituksesta asia ole jo aivan selvä? Sinulla ei ole luokan (tai no tietueen) "Hahmot" instanssia, joten et voi kutsua sen funktiota. Toiseksi, mitä luulet laittavasi vektoriin, jos funktion paluutyyppi on void? Kertaa miten funktiot toimii ja miten luokista (ja tietueista) tehdään instansseja.

Tuo nimisemantiikka on myös täysin hukassa. Tallennetaanko Hahmot-tietueeseen *useita* hahmoja? Ei. Miksi siis monikko? Pääsääntöisesti luokkien nimet yksikköön, mikäli eivät ole kääreitä (wrappereita) tietorakenteille kuten taulukko tai vektori. Näissä tilanteissa on suotavaa nimetä kääreluokan nimi monikkomuotoon. Samaa kaavaa toistaa tuo "Siviilit" funktio. Yrität tehdä yhtä siviiliä (per funktiokutsu), miksi siis funktion nimi on siviilit? Miksi ei kuvaavampi kuten "luoSiviili()"?

Lue, googleta, harjoittele. Kohdatessasi kääntäjävirheen, lue se. Siinä kerrotaan useimmiten kaikki tarpeellinen.

mika132 [03.08.2010 18:44:18]

#

Kiitos, mutta en ymmärrä, miksi nyt tämä väittää, että LuodaanSiviilit funktiota käytetään, mutta ei määritetä missään. :o

//peli.cpp

namespace peli {
	static Hahmot LuodaanPelaajat(peli::Pelaaja const& p);
	static Pelaaja uusi_peli();
}



std::vector<peli::Hahmot> LuodaanPelaajat(peli::Pelaaja const& p) {
    std::vector<peli::Hahmot> s;
    char Siviili[p.asukkaita];
    int x_place, y_place;
    srand(time(NULL));
    x_place = rand() % 600 + 1;
    y_place = rand() % 600 + 1;
    for (short int a = 0; a < p.asukkaita; a++)
    {
        s.push_back(peli::Hahmot::Hahmot(4000, 1, 22, 100, 100, 1500, 1, 1, 1, x_place, y_place, 1));
    }
    std::ofstream fout("data/player.dat", std::ios::out);

    if(fout)
    {
        std::cout << "Tallenna() TOIMII!!" << std::endl;

        for(unsigned short int i = 0; i < s.size(); i++)
            fout<<s[i].rahaa << s[i].tyota << s[i].ika<<std::endl;
    }
    fout.close();

    return s;

}
//peli.hpp

    struct Hahmot {
 		int rahaa, tyota, ika, mieliala, tyytyvaisyys_johtajaan, palkka, asiaa, ID, asuin_data, x, y, arvonimi;
        float size;
        Hahmot(int rahaa, int tyota, int ika, int mieliala, int tyytyvaisyys_johtajaan, int palkka, int asiaa, int ID, int asuin_data, int x, int y, int arvonimi)
        {
            this->rahaa = rahaa;
            this->tyota = tyota;
            this->ika = ika;
            this->tyytyvaisyys_johtajaan = tyytyvaisyys_johtajaan;
            this->palkka = palkka;
            this->asiaa = asiaa;
            this->ID = ID;
            this->asuin_data = asuin_data;
            this->x = x;
            this->y = y;
            this->arvonimi = arvonimi;
        };
    };

Ja errori on, että funktiota LuodaanSiviilit käytetään, mutta ei määritellä. Kyllä se minusta siellä peli namespacessa määritellään.

Milo [03.08.2010 22:51:20]

#

"static Hahmot LuodaanPelaajat(peli::Pelaaja const& p)" != "std::vector<peli::Hahmot> LuodaanPelaajat(peli::Pelaaja const& p)"

mika132 [03.08.2010 23:55:52]

#

no joo. Toi oli luultavasti vinkki et noi on ihan eri funktioita ja joo tajusin ittekki ja pääsinki taas monta askelt eteepäi kunnes palasin melkee lähtöruutuu takasi.

//Näin aja funktiossa yritän tehdä siviiliä:
//Tää on myöskin se errori rivi
std::vector<peli::Hahmot> s = LuodaanSiviili(p);


ja tääl o se luonti funktio:

std::vector<peli::Hahmot> LuodaanSiviili(peli::Pelaaja const& p) {
    std::vector<peli::Hahmot> s;
    char Siviili[p.asukkaita];
    int x_place, y_place;
    srand(time(NULL));
    x_place = rand() % 600 + 1;
    y_place = rand() % 600 + 1;
    for (short int a = 0; a < p.asukkaita; a++)
    {
        s.push_back(peli::Hahmot::Hahmot(4000, 1, 22, 100, 100, 1500, 1, 1, 1, x_place, y_place, 1));
    }
    std::ofstream fout("data/player.dat", std::ios::out);

    if(fout)
    {
        std::cout << "Tallenna() TOIMII!!" << std::endl;

        for(unsigned short int i = 0; i < s.size(); i++)
            fout<<s[i].rahaa << s[i].tyota << s[i].ika<<std::endl;
    }
    fout.close();

    return s;

}

ja errori on:
undefined reference to `peli::LuodaanSiviili(peli::Pelaaja const&)'


Enkä ymmärrä miksi se ei muka löydä funktiota. Sehän on namespace peli sisällä tuolla funktio nimellä LuodaanSiviili

Metabolix [04.08.2010 10:42:48]

#

Ota matopelioppaasta jonkin funktion esittely ja määrittely ja vertaa niitä. Ota sitten oman funktiosi esittely ja määrittely ja vertaa niitä. Huomaat toivottavasti yhden keskeisen eron, minkähän?

Jos viitsisit vihdoinkin lukea kaikki oppaat ajatuksella ja oikeasti opetella – vaikka sitten ulkoa – kaikki C++:n perusteet, säästäisit tuntikausia sekä toisten aikaa että omaasi. Tässäkin keskustelussa on nähty jo aika pelottavia virheitä ihan yksinkertaisessa logiikassa.

mika132 [04.08.2010 17:37:24]

#

No siis olen kyllä katsonut ja katsoin nyt uudestaan matopelin funktio esittelyä.

static std::vector<peli::Hahmot> LuodaanSiviili(Pelaaja& p);

mutta jos tuossa alussa on tuo static mikä on matopelin suurinpiirtein samantapaisissa funktioissa erona, että ne yhdistetään pelkkään olioon tämä vectoriin, niin jos se static on siinä tulee ongelma, että se väittää taas, että sitä käytetään, mutta ei koskaan alusteta. Enkä ymmärrä mitä ihmettä se muka meinaa, koska se kyllä alustetaan namespace pelissä ja sitä kyätetään peli.cpp:ssä.

Milo [04.08.2010 18:13:18]

#

Hirvittää pyytää, mutta heitä tuotoksesi osoitteessa http://codepad.org olevaan tekstikenttään, valitse kieleksi C++ ja lähetä paluupostina linkit tänne niin näkee kuinka pahasti pielessä oletuksesi on. Yksi osoite per tiedosto, kiitos.

Metabolix [04.08.2010 18:21:09]

#

Menepä sitten lukemaan oppaasta, mitä se static tarkoittaa. Aivan kuten edellisenkin viestini lopussa kehotin. Tämän jälkeen sinun pitäisi osata itse korjata ongelma. (Epäilen kuitenkin, että koodissasi on myös toinen virhe, nimittäin funktion määrittelyn alussa. Sekin selviää ihan vain katsomalla ja vertailemalla sekä tietenkin lukemalla oppaasta uudestaan nimiavaruuksia käsittelevät osuudet.)

mika132 [05.08.2010 06:19:41]

#

Yritän vielä tätä ennen kuinlaitan koodia minnekkään. Taisin vihdoin löytää sen paikan missä vika on. Onkos se funktionkutsumisessa

std::vector<peli::Hahmot> s = LuodaanSiviili(p);

Se on peli.cpp aja funktiossa tuolla tavalla.

jos tuo on väärä kutsumis tyyppi mikä on se oikea. :o

mika132 [15.08.2010 17:13:43]

#

Pelini väittää nyt, että sellaista funktiota ei ole peli::LuodaanSiviili kohdassa vaikka on. Errori rivi:

std::vector<peli::Hahmot> s = LuodaanSiviili(p);

ja Namespace peli sekä alhaalla itse funktio:

namespace peli {
        std::vector<peli::Hahmot> LuodaanSiviili(Pelaaja& p);
	static Pelaaja uusi_peli(); //Tästä ei tartte välittää
}

//Täällä toi LuodaanSiviili funktio:



std::vector<peli::Hahmot> LuodaanSiviili(peli::Pelaaja const& p) {
    std::vector<peli::Hahmot> s;
    char Siviili[p.asukkaita];
    int x_place, y_place;
    srand(time(NULL));
    x_place = rand() % 600 + 1;
    y_place = rand() % 600 + 1;
    for (short int a = 0; a < p.asukkaita; a++)
    {
        s.push_back(peli::Hahmot::Hahmot(4000, 1, 22, 100, 100, 1500, 1, 1, 1, x_place, y_place, 1));
    }
    std::ofstream fout("data/player.dat", std::ios::out);

    if(fout)
    {
        std::cout << "Tallenna() TOIMII!!" << std::endl;

        for(unsigned short int i = 0; i < s.size(); i++)
            fout<<s[i].rahaa << s[i].tyota << s[i].ika<<std::endl;
    }
    fout.close();

    return s;

}

ja vielä errori:
undefined reference to `peli::LuodaanSiviili(peli::Pelaaja&)'

Metabolix [15.08.2010 17:18:47]

#

Et ole vieläkään osannut korjata virhettä, jonka suuntaan olen monta kertaa vihjaillut, vaikka ratkaisu lukee suoraan useammassakin oppaassa.

Ongelma on yksinkertaisesti siinä, että esittelet funktion peli::LuodaanSiviili mutta määrittelet myöhemmin funktion LuodaanSiviili nimiavaruuden ulkopuolella.

Mene nyt vihdoinkin lukemaan oppaasta, miten osuus nimiavaruudet toimivat. Sieltä tämäkin tieto sekä oikea ratkaisu löytyvät parin minuutin lukemisella.

mika132 [28.08.2010 17:35:28]

#

Osaan minä nimiavaruuksia käyttää ja luin oppaankin nyt uudestaan varmuuden vuoksi ja kyllä suhteellisen oikein olen tehnyt kaikki. Joten en keksi kuin antaa koko koodin ja toivoa, että osaisitte auttaa.

Lähdekoodi

ja errori:
error: `std::vector<peli::Hahmot, std::allocator<peli::Hahmot> > peli::LuodaanSiviili(const peli::Pelaaja&)' should have been declared inside `peli'

Metabolix [28.08.2010 21:23:07]

#

Hienoa: korjasit yhden virheen! Valitettavasti koodisi on niin täynnä virheitä, että yhden korjaaminen vain paljasti seuraavan. Vertaapa nyt funktion esittelyä ja määrittelyä. Onko kyseessä sama funktio? (Vastaus: ei ole, koska määrittelyssä on ylimääräinen sana.)

mika132 [20.09.2010 16:42:48]

#

noniin. Löysin sen väärän jutun määrittelystä ja nyt toimii:

static std::vector<peli::Hahmot> LuodaanSiviili(peli::Pelaaja const& p);

Koodi on muuten samallainen kuin tämä:
Vanha lähde

mutta erona on se, että tuo yllä oleva koodi on sen vanhan luodaanSiviili määrittelyn kohdalla.


Ongelma on nyt se, että kun ei vectoreista ole kummoisempaa kokemusta niin miten saan x, y akselit tietoon ja piirrettyä ne ja miten vectoreiden x,y akseleita muutetaan?

Spongi [20.09.2010 18:59:02]

#

Vektoreiden? std::vector on vain härdelli johon tungetaan tavaraa, ei siihen liity matikka.

std::vector<Hahmo> hahmot;
// lisää jotain kivoja hahmoja tässä vaiheessa
hahmot[0].x = 666;
hahmot[0].y = 666;

Torgo [21.09.2010 11:43:37]

#

mika132 kirjoitti:

Ongelma on nyt se, että kun ei vectoreista ole kummoisempaa kokemusta niin miten saan x, y akselit tietoon ja piirrettyä ne ja miten vectoreiden x,y akseleita muutetaan?

Mistäköhän vektorista oikein puhut? Koska muita vektoreita en tuolla näe, kuin std::vectorin, niin oletan että kyse on siitä? Jos näin, niin asia on juuri niin kuin Spongi sanoi. Eli std::vector on pelkkä säiliö johon voi laittaa tavaraa talteen dynaamisen taulukon tyyliin. Sillä ei ole olemassa mitään x- ja y-akseleita. Vektorin elementtiin pääsee käsiksi joko iteraattorin avulla tai suoralla osoituksella (jäsenfunktio at() tai []-operaattori).

http://www.cplusplus.com/reference/stl/vector/

Jos tarkoitat peli::Hahmot tyypin x- ja y-koordinaatteja, niin niiden muuttaminen riippuu aivan niiden totetutuksesta. Voit muokata niitä suoraan Spongin osoittamalla tavalla, jos ne on määritetty julkiseksi. Fiksumpaa olisi määrittää ne yksityisiksi ja toteuttaa access-funktiot. Silloin asettaminen voisi tapahtua vaikkapa näin:
hahmo.asetaPaikka(1, 2);


Sivun alkuun

Vastaus

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

Tietoa sivustosta