Eli mielestäni C++ taulukot eivät toimi samalla tavalla kuin PHP:ssä koska en saa niitä toimimaan. Tarkoitus on tehdä engine mikä luo pelaajia tallentaa ne muistioon aivan kuin tietokantaan ja heidän tietoja voidaan jälkeenpäin ottaa sielät HUOM! Tämä engineni on vasta kehitys asteella eikä lähelläkään loppua.
Mutta ongelmia tuli taulukoiden kanssa kun alkaa väittämään tälläistä.
error: invalid types `float[float]' for array subscript
13 kertaa sama errori ja rivit ovat kaikki ne missä on yksikin talulukko.
struct Pelaajat { float maalit, syotot, pisteet; };
Pelaajat LuodaanPelaajat() { Pelaajat p; for (float a=0; a <= 18; a++) { p.maalit[a]=(0); p.syotot[a]=(0); p.pisteet[a]=(0); } std::ofstream fout("player.dat", std::ios::out); if(fout) { std::clog << "Tallenna() TOIMII!!" << std::endl; fout<<p.maalit[0] << p.syotot[0] << p.pisteet[0] <<std::endl; fout<<p.maalit[1] << p.syotot[1] << p.pisteet[1] <<std::endl; fout<<p.maalit[2] << p.syotot[2] << p.pisteet[2] <<std::endl; /*Tämän tekemiseen on varmaan nopeampiakin tapoja, koska näitä on minulla 18, mutta en halua, että kerrotte ainakaan suoraan sitä nopeampaa tapaa jos jollekkin tulee mieleen kertoa, koska haluan yrittää tehdä koko enginen aivan itse.*/ } fout.close(); }
Vaihda for-silmukassa float:n tilalle int.
Olen kyllä koittanut, mutta ei auta.
E: ja muistaakseni float silmukassa ei toimi edes int. Tai ei minulla ainakaan ole toiminut, mutta ei siitä sen enempää vaan takaisin ongelmaan.
Meinaatko että pelaajia on se 19 kpl vai että maaleja on 19? Tällähetkellä tuo olettaa että maalit, syotot ja pisteet ovat taulukoita. Sun pitäs pistää se tyyliin p[a].maalit jne. että se menee oikein. Muista kanssa alustaa pelaaja-muuttuja siten että varaat tarpeeksi tilaa taulukkoon. Ja kuten sanottu, käytä int-tietotyyppiä silmukassa.
PHP:n taulukot tosiaan kanssa toimii hieman dynaamisemmin (kautta automaattisemmin) kuin C++:ssa. Varo sitä sudenkuoppaa että luulet taulukossa olevan soluja 20 asti jos luot sen jotenkin näin: int luvut[20]
. Tosiasiassa tuosta löytyy vain 0-19 väliltä arvoja.
Ongelmasi on, että koodissasi ei oikeasti nyt ole yhtäkään taulukkoa. Lue lisää oppaasta. Lisäksi for-silmukassa kuuluu tässä tilanteessa nimenomaan olla int – tämäkin kerrotaan oppaassa oikein esimerkkien kanssa, ja lisäksi jos ymmärtäisit edes perusasiat tietotyypeistä, tajuaisit itsekin, miksi.
#include <vector> const int PELAAJIA = 19; struct Pelaajat { float maalit, syotot, pisteet; Pelaajat(float maalit, float syotot, float pisteet) { this->maalit = maalit; this->syotot = syotot; this->pisteet = pisteet; }; }; std::vector<Pelaajat> LuodaanPelaajat() { //vectori johon voi laittaa pelaaja-alkiota. std::vector<Pelaajat> p; for (short int a = 0; a < PELAAJIA; a++) { p.push_back(Pelaajat(0,0,0)); } std::ofstream fout("player.dat", std::ios::out); if(fout) { std::cout << "Tallenna() TOIMII!!" << std::endl; for(unsigned short int i = 0; i < p.size(); i++) fout<<p[i].maalit << p[i].syotot << p[i].pisteet<<std::endl; } fout.close(); return p; }
Vehkiksen esimerkki on virheellinen: funktion paluuarvon tyyppi on Pelaajat, mutta return-lauseella yritetään palauttaa taulukollinen niitä. Ja joka tapauksessa olisi loogisempaa antaa tyypin nimeksi Pelaaja, koska sehän kuvastaa vain yhtä pelaajaa. Taulukon palauttaminen on kysymys sinänsä; tässä kannattaisi taas käyttää dynaamista muistinvarausta (dynaamisesti varattua taulukkoa, linkitettyä listaa tai standardikirjaston vector- tai list-luokkaa).
vehkis91 kirjoitti:
Juu tosiaan, voisko joku moderaattori heittää tonne * ton pelaajat- tekstin jälkee.
Se aiheuttaisi vain totaalisen katastrofin: taulukko on funktion paikallista dataa, ja sen käyttäminen vielä funktion ulkopuolella kaataisi ohjelman todella nopeasti, koska sama muisti on jatkuvasti käytössä aina kunkin funktion paikallisille muuttujille (näin hieman naiivisti selitettynä). Jos kuitenkin keksit jonkin toimivan ratkaisun, voit kyllä muokata viestiäsi.
Globaali taulukko voisi olla kysyjän taitoihin nähden sopivin vaihtoehto. Ei sillä isoa peliä tehdä, mutta eipä tehdä noilla "taidoilla" muutenkaan. >_> Jatkon kannalta kannattaisi ihan ensimmäiseksi panostaa lukutaitoon ja loogisen ajattelun taitoon.
Juu eli, nyt on ihan testattukkin toiminta, ku tuli noin paljo virheitä ilman testausta.
Edit: jaa katos laitoit, että globaali taulukko ois paras... No eiköhän joku toinen jaksa tehdä siitä esimerkin, vaikka pitäis OPASTA LUKEMALLA olla selvinny jo miten se toimii.
Edit2: poistin turhaksi tulleen viestin välistä...
Edit3: Tuli tuossa vaan mieleen, että mitä järkeä on tallentaa niitä pelaajien tietoja tuossa vaiheessa tiedostoon, sillä kaikillahan on kaikkea tasan 0.
Tuosta puuttuu vielä taidot. Eli ne eivät ole nolla. Ja ne tallennetaan tuossa vaiheessa siksi, että voin käyttää pelaajien tietoja kuin tietokannasta etsisi myöhemmässä vaiheessa peliä, eikä tarvitse tehdä mitään olio sotaa. Päätin ottaa ehdotuksestanne mallia ja tehdä tekstipohjaista peliä jossa opettelen vähän kaikennäköistä. Kuten esimerkiksi juuri tämä, että tiedostoja käytetään niin, että otetaan välistä muutama data ja taas toisesta välistä muutama data. SDL_ttf käytän kuitenkin tekstien kirjoitukseen, koska en koskaan saanut sitä PCursesia vai mikä se oli niin toimimaan.
vehkis91 koodi vaikutti melko omituiselta ja siellä on taas vectorit joita en hallitse yhtään ja kai C++ nyt taulukoita pystyy ilman vectoreitakin käyttämään? Eli onko jotain toista ratkaisu keinoa. Ja tuo putkan C++ opas aiheesta taulukot on tullut luettua muutamaan otteeseen tässä mietitessä eikä siellä ole kerrottu muusta kuin siitä, että taulu[20]; antaa jonkin arvon väliltä 0-20, enkä tajua mitä hyötyä tälläisestäkin taulukko systeemistä voi olla, mutta ei siitä sen enempää vaan takaisin asiaan. Onko mitään toista ratkaisu keinoa missä ei käytettäisi aivan tolkutonta olio sotaa eikä vectoreita, koska yritän nyt ensin päästä hieman perusteisiin sisään.
//nyt tuo sisältää 20 pelaajat-oliota Pelaajat p[20]; //nyt ensimmäisen alkion maalit-muuttujan arvo on 1; p[0].maalit = 1;
mika132 kirjoitti:
taulu[20]; antaa jonkin arvon väliltä 0-20
Näin siellä ei todellakaan sanota. O_o Ole hyvä ja lainaa tänne kohta, jossa mielestäsi lukee näin.
Yrität siis vieläkin liian vaikeita asioita. Lue opasta uudestaan, kunnes ymmärrät asiat kunnolla. Kokeile vaikka niitä taulukkoja: tee samantapaisia pieniä koodeja kuin oppaan esimerkeissä, kunnes kunnolla tajuat, miten niitä määritellään ja millä tavalla taulukko eroaa tavallisesta muuttujasta.
Unohda PHP. Heikosti tyypitetyillä skriptikielillä ja vahvasti tyypityillä käännettävillä kielillä on muuttujien kannalta valtava ero, ja PHP on vielä erityinen mörkö, koska siinä taulukko ei oikein vastaa muiden kielten käsitystä taulukosta, vaan samaan pakettiin on yhdistetty myös hajautustaulu (hash map).
Tiedoksesi: C++:n taulukko on siinä mielessä aivan erilainen kuin PHP:n taulukko, että C++:n taulukossa on (kuten oppaassakin kerrotaan) aina kohdat nollasta N-1:een, missä N on kohtien kokonaismäärä. Taulukon kokoa ei voi muuttaa jälkikäteen.
<?php $taulukko = array(); // EI onnistu C++:n taulukoilla. $taulukko[] = 1; // EI onnistu C++:n taulukoilla. $taulukko["x"] = "hei"; // EI onnistu C++:n taulukoilla. if (isset($taulukko[4]))... // EI onnistu C++:n taulukoilla.
C++:n taulukko toimii aivan kuin kasa muuttujia:
int a0, a1, a2; // Kasa muuttujia. int t[3]; // Taulukko. a0 = 10; // Sijoitus muuttujaan. t[0] = 10; // Sijoitus taulukon kohtaan 0, joka on oikeastaan int-muuttuja.
Keskeisin ero on tämä:
int i = 2; t[i] = 10; // t[2] = 10; ai = 10; // EI onnistu; ai pysyy ai:na, siitä EI tule a2.
Toinen keskeinen ero on, että (automaattisesti varattua) taulukkoa ei voi palauttaa funktiosta. Kolmas ero liittyy osoittimiin, mutta sillä ei ole nyt merkitystä.
Jos teet tekstipohjaista peliä, niin sill yleensä tarkoitetaan sellaista, missä tekstit tulostetaan konsoliin...
vehkis91 kirjoitti:
Jos teet tekstipohjaista peliä, niin sill yleensä tarkoitetaan sellaista, missä tekstit tulostetaan konsoliin...
Erittäin hyvä huomio. Tekstipohjaisen pelin tekemiseen ei tarvita sen paremmin SDL:ää kuin PDCursesiakaan. Peli voi näyttää vaikka tältä:
Seisot synkän metsän laidassa. Takanasi näkyy niitty, jolla ennen paimensit lampaita, ja edessäsi aukeaa suuri maailma. Mitä teet? 1. Mene metsään. 2. Palaa kotiin. -- Perusvalikko: I = inventaario; P = päiväkirja; T = tilanne; H = henkilötiedot; N = nukkuminen; Valintasi:
Ja valinnan H jälkeen:
Nimi: Pirkko-Pekka Paavolainen-Pulliainen. Ikä: 15 vuotta ja 3 kuukautta Ammatti: lammaspaimen Massa: 70 kiloa Käsivoimat: 650 Newtonia Jalkavoimat: 2200 Newtonia Nopeus: 7 metriä sekunnissa (jne.) -- Perusvalikko: I = inventaario; P = päiväkirja; T = tilanne; H = henkilötiedot; N = nukkuminen; Valintasi:
Tiedän kyllä tuon, mutta olen tehnyt tuollaisia neljä kappaletta.
No sain kyllä taulukot toimimaan, mutta jokin merkkijonoissa hämää, koska peli kaatuu välittömästi kirjoitettuaan tiedot ylös ja antaa errorin 3 eli polkua ei löydy. Mitä ihmeen polkua kun kaikki se osaa ylös kirjoittaa? Eli tidostossa on tälläistä:
Mikko | 0 | 0 | 0 Saku | 0 | 0 | 0 Tomi | 0 | 0 | 0
ja koodin tälläistä:
std::string KatsoNimi() { int Namee = rand() % 5 + 1; if (Namee == 1) { std::string name="Kari"; return name; } if (Namee == 2) { std::string name="Mikko"; return name; } if (Namee == 3) { std::string name="Saku"; return name; } if (Namee == 4) { std::string name="Tero"; return name; } if (Namee == 5) { std::string name="Tomi"; return name; } } Pelaajat LuodaanPelaajat() { Pelaajat p[20]; for (int a=0; a <= 18; a++) { p[a].name=KatsoNimi(); p[a].maalit=0; p[a].syotot=0; p[a].pisteet=0; } std::ofstream fout("data/player.dat", std::ios::out); if(fout) { std::clog << "Tallenna() TOIMII!!" << std::endl; fout<<p[0].name << " | " <<p[0].maalit << " | " << p[0].syotot << " | " << p[0].pisteet <<std::endl; fout<<p[1].name << " | " <<p[1].maalit << " | " << p[1].syotot << " | " << p[1].pisteet <<std::endl; fout<<p[2].name << " | " <<p[2].maalit << " | " << p[2].syotot << " | " << p[2].pisteet <<std::endl; } fout.close(); }
a) et palauta funktiostasi mitään vaikka lupaat palauttaa 'Pelaajat' tyyppisen olion (huom. yhden olion, et edelleenkään taulukkoa/vektoria).
b) luot edelleen lokaalin taulukon funktion sisällä ja semmoista ei voi palauttaa.
c) C++:ssa yleisnen käytäntö on käyttää std::vector tietorakennett taulukoiden sijasta.
d) miten taulukoiden käyttö voi tuottaa noin paljon ongelmia? tai siis, onko kaikki väännettävä ratakiskosta?
#include <iostream> #include <vector> #include <string> int arvo_luku(int ala, int yla); struct Pelaaja{ std::string nimi; int maalit; int syotot; }; std::vector <Pelaaja> Pelaajat; std::vector <Pelaaja> arvo_pelaajat(); void tallenna_tiedostoon(std::vector <Pelaaja> &Pelaajat); int main(int kpl, char** argumentit){ Pelaajat = arvo_pelaajat(); std::cout << Pelaajat[0].nimi << std::endl; tallenna_tiedostoon(Pelaaja); return EXIT_SUCCESS; }
Tehtäväksi jää noiden tarvittavien funktioiden määrittely. Yhdelle onkin jo tullut ihan toimiva määrittely.
mika132 kirjoitti:
Tiedän kyllä tuon, mutta olen tehnyt tuollaisia neljä kappaletta.
Jos et osaa käyttää taulukoita etkä linkitettäviä listoja, et ole mitenkään voinut tehdä peliä, jossa pelin kulku olisi täysin kirjoitettu erilliseen tiedostoon, jossa kerrottaisiin eri tilanteet, eri jatkovaihtoehdot sekä löytyvät ja tarvittavat esineet. Tee seuraavaksi sellainen.
Korjaus tarvitaan tietenkin otsikot ctime ja cstdlib Lisäksi lopussa oleva funktiokutsu tallenna_tiedostoon haluaa parametsiksi Pelaajat
Itseasiassa ainut ongelma oli siinä, että puuttui tämä:
return p[20];
Eli niinkuin sanoitte en palauttanut mitään, mutta nyt toimii kiitos. =)
Tajuatko, mitä tuo rivi tekee? Mitä nyt palautat funktiostasi? (Etpä taida tajuta. Lisäsit nimittäin juuri ohjelmaasi taas uuden virheen.)
No jos se on virhe niin miksi peli toimii? :o
E: No jopas nyt on kumma. Eipä toimi enää vaikka en mitään ole tehnyt muuta kuin returnin lisännyt. Tekee taas samaa että avaa pelin ja sitten sammuttaa heti ja valittaa windows errorin kolme kanssa.
Nyt selvität tuon kyseisen return-rivin täyden merkityksen ja kerrot sen tässä. Tässä on apukysymyksiä, joihin voisit samalla vastata:
1. Mitä return ylipäänsä tekee?
2. Miksi kääntäjä haluaa return-rivin kyseiselle funktiolle?
3. Tarvitsetko todella returnia, vai lisäsitkö sen vain, koska kääntäjä valitti?
4. Jos et tarvitse, mitä voisit tehdä return-rivin lisäämisen sijaan?
5. Mitä merkintä p[20] return-sanan jälkeen tarkoittaa?
Jos et pysty vastaamaan näihin kysymyksiin täysin loogisesti, selkeästi ja oikein, suosittelen vakavasti C++:n kaltaisen vaikean kielen unohtamista, kunnes opit ohjelmoinnin perusteet kunnolla.
Koko returnia ei tarvita ja funktion nimen muutin void muotoon, mutta yksi juttu tuli silti mieleen. Nyt ohjelmani tallentaa koko ajan samaa tietoa. Samat taidot ja samat nimet vaikka päälläni seisoisin.
Nuo kysymyksesi:
1. Mitä return ylipäänsä tekee?
Palauttaa arvon esimerkiksi (bool, int, string, float)
2. Miksi kääntäjä haluaa return-rivin kyseiselle funktiolle?
Koska koodin funktion alussa on Pelaaja
3. Tarvitsetko todella returnia, vai lisäsitkö sen vain, koska kääntäjä valitti?
En tarvitse, vaan voin vaihtaa sen void muotoon, koska käytännössä oliota ei tarvita sen enempää vaan kaikki tallennetaan tiedostoon.
4. Jos et tarvitse, mitä voisit tehdä return-rivin lisäämisen sijaan?
Pistää funktio void muotoon.
5. Mitä merkintä p[20] return-sanan jälkeen tarkoittaa?
palautetaan p[20] taulukko.
5. kohta meni väärin, yritä uudestaan. Yksi viestini tässäkin keskustelussa kumoaa jo väitteesi, muistitko lukea? Myöskään oppaassa ei todellakaan anneta ymmärtää noin. Ajattele järkevästi: jos funktion piti tyyppinsä perusteella palauttaa yksi pelaaja, eihän se voi silloin mitenkään palauttaa taulukkoa.
Voisit myös soveltaa tuollaista äärimmäisen yksinkertaista järkeilyä ongelmiisi jo ennen niiden lähettämistä keskusteluun. Katso jokaista virherivillä tai sen lähialueilla olevaa asiaa (sanaa, muuttujaa, lauseketta, ...) ja mieti, miksi tämä on tässä ja mitä tämä oikein tekee.
Nyt taisi sytyttää. Tuo systeemi mikä minulla nyt on niin sitä ei voida edes toteuttaa olio pohjaisesti, mutta kun otan tietoa tiedostosta niin tällöin voin käyttää oliota hyväksi. Eli tarkoitan nyt sitä, että tulee se yksi suuri ongelma. Miten hemmekossa niitä uusia olioita luodaan?
mika132 kirjoitti:
Nyt taisi sytyttää. Tuo systeemi mikä minulla nyt on niin sitä ei voida edes toteuttaa olio pohjaisesti, mutta kun otan tietoa tiedostosta niin tällöin voin käyttää oliota hyväksi. Eli tarkoitan nyt sitä, että tulee se yksi suuri ongelma. Miten hemmekossa niitä uusia olioita luodaan?
RTFM
Sen lisäksi kantsii opetella käyttämään debuggeria. Sen kanssa voi rivi riviltä
suorittaa koodia ja nähdä mikä menee pieleen.
Voit käyttää vaikkapa valmiita funktioita nämä toimivat lähes kuten PHP:n vastaavat. Voit lukea tiedoston yhdellä pilkkoa toisella ja lopuksi tehdä tiedoilla vaikkapa taulukollisen olioita.
mika132 kirjoitti:
Tuo systeemi mikä minulla nyt on niin sitä ei voida edes toteuttaa olio pohjaisesti
Entistä pahemmin metsään. Jauha nyt vain ahkerasti niitä C++-oppaan seitsemää ensimmäistä osaa, kunnes opit ja ymmärrät täydellisesti koko matopelioppaan (tai kyllästyt ja vaihdat kieltä). Jos ymmärtäisit kunnolla edes sen linkitetyn listan (piirrä!), pääsisit jo tässäkin asiassa eteenpäin.
Olen myös sitä mieltä, että kannattaisi opetella perustietorakenteet ennen peliohjelmoinnin aloittamista. Muuten homma menee vaikeaksi ja into lopahtaa nopeasti.
Opiskele ajatuksella linkitetty lista. Siitä löytyy myös erilaisia variaatioita, jotka ovat hyödyllisiä opiskella myös.
Itse tykkään erityisesti ympyrän mallisesta linkitetystä listasta, missä ensimmäinen node on vahti (sentinel). Tämän etuna on tietysti, että säästetään yksi node ja sen lisäksi yksi vertailu listaoperaatioissa. Esim. jos haluat säilyttää tietoja järjestysnumeron suuruuden mukaan lajitellussa listassa, niin voit laittaa vahti nodeen sellaisen numeron, mikä on suurempi kuin mitä listaan lisättävissä tiedoissa on mahdollista olla. Tällöin voit listaan lisätessä silmukassa vain vertailla ja tarvittaessa liikkua listassa eteenpäin. Sinun ei tarvitse erikseen tarkistaa oletko listan lopussa, koska vahti node viimeistään katkaisee vertailu silmukan.
Ymmärrän minä linkitettyjä listoja. En kai muuten niitä osaisi tuohon laittaa. Ongelma on vain se, että C++ taulukot tuntuvat olevan monimutkaisia olion kanssa yhdessä. Eli miten ne oikein yhdistetään. Koodini on tuolla ylempänä. :o
mika132 kirjoitti:
Ymmärrän minä linkitettyjä listoja. En kai muuten niitä osaisi tuohon laittaa.
Mihin laittaa? Minä en ainakaan näe koko tässä keskustelussa yhtäkään linkitettyä listaa, ja edellisessä juuri todettiin, ettet osannut lisätä etkä poistaa panoksia. Et voi ymmärtää, jos et osaa toteuttaa edes noita perustoimituksia.
mika132 kirjoitti:
Ongelma on vain se, että C++ taulukot tuntuvat olevan monimutkaisia olion kanssa yhdessä.
Eivät ne eroa mitenkään siitä, miten taulukko toimii vaikkapa kokonaislukujen kanssa, tai toisaalta siitä, miten olioita käytetään yksittäisinä muuttujina.
Tuntuu, että yrität vääristellä ja vähätellä ongelmaasi, jotta saisit lisää valmista koodia, jolla pärjäisit taas pari päivää. Ei tipu! Opettele nyt ihan oikeasti itse. Neuvoja ja esimerkkejä on tullut niin oppaissa kuin keskusteluissakin jo vaikka millä mitalla, joten jos et näillä pärjää, et varmasti pärjää millään.
Pura ongelmasi samantapaisiin pieniin osiin, jollaisia esittämissäni apukysymyksissä on ollut, ja kysy täällä niitä yksittäisiä kohtia, joita et kovalla yrittämiselläkään saa mistään selville. Kysymyksestäsi "miten oliot ja taulukot toimivat yhdessä" voisit tehdä vaikka parikymmentä pienempää kysymystä. Tietoakin löytyy paremmin, kun et yritä selvittää kaikkea kerralla vaan luet asiat yksitellen. Vasta aivan lopuksi – usean tunnin lukemisen ja tutkimisen ja kokeilemisen jälkeen – voit sitten kysyä täällä niitä pieniä kysymyksiä.
miten ne taulukot nimenomaan olioiden kanssa ovat vaikeita? ihan samalla tavalla ne riippuu käytit olioita tai et :D.
linkitetyssä listassa saat vain edellisen tai seuraavan alkion, ajattele sitä esim. ketjuna niin tajuat ennen pitkää.
Öööh.. Tämä ei nyt näytä johtavan ojaan eikä allikkoon. Suosittelen oikeasti kokeilemaan CoolBasic-kieltä: http://www.coolbasic.com/ Se on helppokäyttöinen ja sillä voi tehdä matopelejä, rakettipelejä, tasohyppeilyitä ja kaikkea tuollaista kivaa helposti ja mukavasti. Lisäksi CoolBasic:lla on oma foorumi, jossa on paljon innokkaita auttajia. Kokeile!
Btw. Onko kukaan kuunnellut Finntroll:ia? On muuten hyvä bändi. ;)
Juu ja pitkä suomenkielinen manuaali. Olen käyttänyt CoolBasiciä 8kk. GameMakeriä 1vuoden ja PHP:tä 2 vuotta. Eli olen koodannut elämässäni paljon mutta C++ ei vain taivu päähäni.
Nyt se taitaa taas toimia kun hetken leikein, mutta mietien, että mikä olisi tuohon tiedostoon tallennukseen lyhyempi tapa. Mietein ensin for silmukkaa, mutta se ei tallenna kun ekalle riville. Noita on nimittäin melko karsea tehdä 100-200 + joukkueiden pelaajat. :)
if(fout) { std::clog << "Tallenna() TOIMII!!" << std::endl; fout<<p[0].name << " | " <<p[0].maalit << " | " << p[0].syotot << " | " << p[0].pisteet << " | " << p[0].hyokkays << " | " << p[0].puolustus << " | " << p[0].laukaus << " | " << p[0].syottaminen << " | " << p[0].tekniikka << " | " << p[0].agressiivisuus << " | " << p[0].torjunta <<std::endl; fout<<p[1].name << " | " <<p[1].maalit << " | " << p[1].syotot << " | " << p[1].pisteet << " | " << p[1].hyokkays << " | " << p[1].puolustus << " | " << p[1].laukaus << " | " << p[1].syottaminen << " | " << p[1].tekniikka << " | " << p[1].agressiivisuus << " | " << p[1].torjunta <<std::endl; /// ... [2], [3], [4] ... }
mika132 kirjoitti:
Nyt se taitaa taas toimia kun hetken leikein, mutta mietien, että mikä olisi tuohon tiedostoon tallennukseen lyhyempi tapa. Mietein ensin for silmukkaa, mutta se ei tallenna kun ekalle riville. Noita on nimittäin melko karsea tehdä 100-200 + joukkueiden pelaajat. :)
Ei sillä väliä ole käyttääkö for-silmukkaa vai ei, saa sen tallentamaan vaikka tuhannelle riville, jos haluaa.
https://www.ohjelmointiputka.net/oppaat/opas.
mika132 kirjoitti:
Nyt se taitaa taas toimia kun hetken leikein, mutta mietien, että mikä olisi tuohon tiedostoon tallennukseen lyhyempi tapa. Mietein ensin for silmukkaa, mutta se ei tallenna kun ekalle riville. Noita on nimittäin melko karsea tehdä 100-200 + joukkueiden pelaajat. :)
No jos kerran olet php:ä ja muita kieliä käyttänyt ja katsot osaavasi ohjelmoida, niin ymmärrät varmaan, että ettei ohjelmia todellakaan kirjoiteta noin. Kyllähän silmukat on tehty juuri sen vuoksi, ettei tarvitse käsin kirjoittaa toistuvia rivejä. Huomaat itsekin tuosta koodista, että mikä pitää olla for silmukan muuttuja ts. indeksi. Vinkki se tulee [] merkkien väliin. :)
tuossa jotain pientä vinkkiä, kopsattuna aikaisemmin laittamastani koodista.
for(unsigned short int i = 0; i < PELAAJIEN_LUKUMAARA; i++) fout<<p[i].maalit << p[i].syotot << p[i].pisteet<<std::endl;
Miten ihmeessä. Osaan kyllä käyttää for silmukkaa en sitä tarkoittanut, mutta ensimmäisellä kerralla, kun laitoin nuo for silmukkaan se veti kaikki samalle riville. Eli korvasi aikaisemman uudella.
Nyt se kuitenkin pisti kaikki eri riville. Mahtavaa. :)
Luultavasti laitoit ensin silmukan väärään paikkaan. Jotta oppisit virheistäsi, yritä toistaa tuo virhe eli laita silmukka tarkoituksella niin, että uusi tieto ylikirjoittaa aina edellisen. Katso sitten koodiasi ja käy mielessäsi läpi, mikä meni pieleen.
juu tein noin ja se teki saman jos laitoin saman for silmukan alle. Eli siis mitä tarkoitan havainnollistava kuva:
for (/*ensimmäinen for missä asetetaan arvot eri kohtiin*/) { //haetaan random arvoja //asetetaan arvot taulukoihin for (/*tässä toinen for mikä taas etsii taulukoiden arvot ja tallentaa ne*/) { //eli tässä tallennetaan } }
eli ongelma oli tuolloin siinä, että for:it olivat päällekkäin. Nykyään "vierekkäin" eli
for (/*ensimmäinen for missä asetetaan arvot eri kohtiin*/) { //haetaan random arvoja //asetetaan arvot taulukoihin } for (/*tässä toinen for mikä taas etsii taulukoiden arvot ja tallentaa ne*/) { //eli tässä tallennetaan }
Mikset tekisi tuota tallennusta samassa silmukassa, kuin sijoitusta? Toisaalta ei tuossakaan mitään vikaa ole. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.