Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C/C++ globaali muisti

DumTom [10.04.2013 20:50:45]

#

Voisiko joku kertoa miten Blitz3D(Basic kieli joka käyttää directX rajapintaa) eroaa C/C++ kääntäjästä muistinkäsittelyn osalta?

Miksi kaikki on globaalia blitzissä ja C/C++:ssa pitää varata dynaamisesti?

Jos blitzin syntaksi ja tietyt typeryydet eli esim. muuttujien esittelyn puuttuminen(mikä tahansa kirjoitusvirhe on uusi muuttuja) ja muutama muu seikka olisivat paremmin tehty/suunniteltu niin sillä voisi kirjoittaa vaikka miten hienon pelin.....

En ole saanut vissiin Windows:silla tehtyä kuin yhden yksinkertaisen pelin C/C++:lla.

DOS:ssin puolella ei ollut ongelmaa että teki suuria luokkia ja globaalin dynaamisen osoittimen niihin.Pystyi jopa esittelemään oliotaulukoita globaalisti.

Windows menee solmuun jossain vaiheessa ja peli kaatuu ilman järkevää syytä ja niin kaatuu myös windows.

Eli miksi kaikesta on tehty niin hankalaa windowsin puolella?

Mulla on nyt yksi Blitz peli valmistumaisillaan ja seuraavan haluan tehdä kyllä C/C++:lla ja SDL:llä.

On vaan niin kädetön olo kun ei tajua missä kohtaa varaan oliotaulukon ja vapautan sen ja mitä teen toiselle oliotaulukolle.

Kokeilin sitäkin että varaan kaikki oliotaulukot mainissa ja viittaan eteenpäin peliin mutta katastrofi oli sekin.

Pitäisikö tässä ottaa C++ opus käteen ja käydä tekemään typeriä esimerkkejä vaikka sormet hamuavat jo korkeammalle?

Toki minulla olisi opittavaa osoittimista,linkatuista listoista,viittauksista ja periytyvyydestä.

C++:ssa tykkään blitziin verrattuna datan kätkennästä niin että tietoa ei voi käsitellä kuin metodeilla joka vie lähes kaikki bugit pois.

En tiedä nyt mitä ajan takaa mutta kertokaa GURUT miksi blitzbasic toimii erilailla kuin C/C++ kääntäjä?

Siinä kai pääpointti.....

Metabolix [10.04.2013 21:57:37]

#

DumTom kirjoitti:

Miksi kaikki on globaalia blitzissä ja C/C++:ssa pitää varata dynaamisesti?

Luultavasti nyt et vain itse ymmärrä. BlitzBasicissa taulukko ei ole sama asia kuin C++:n taulukko. BlitzBasicin taulukko on enemmän samanlainen kuin C++:n std::vector, eli se käyttää oikeasti dynaamista muistinvarausta.

C++-koodissa ei myöskään kannata ikinä käyttää "käsin" new-operaattoria taulukoiden varaamiseen ilman erityisen hyvää syytä. Standardikirjastossa on std::vector ihan sitä varten.

DumTom kirjoitti:

[DOSissa] Pystyi jopa esittelemään oliotaulukoita globaalisti.

Mikään ei estä tekemästä ihan samaa Windowsissakin, vaikkei se olekaan hyvä tapa. Kuten sanoin, std::vector on tässä hyödyllinen.

DumTom kirjoitti:

Jos blitzin – – muuttujien esittelyn puuttuminen

Netissä kerrotaan, että aivan tiedoston alkuun voi laittaa rivin Strict, jolloin muuttujat pitää aina määritellä, tai rivin SuperStrict, jolloin pitää ilmoittaa myös jokaisen muuttujan tyyppi.

DumTom kirjoitti:

En tiedä nyt mitä ajan takaa

No en minäkään. Lähinnä viestistäsi tuli mieleen, että mahtaa olla vaikea koodata, jos ei vain yhtään osaa eikä ymmärrä. Voisi olla avartavaa perehtyä konekieleen (assembly) ja tietokoneen toimintaan sekä peruskäsitteisiin muistista (pino eli stack, keko eli heap).

DumTom kirjoitti:

mutta kertokaa GURUT miksi blitzbasic toimii erilailla kuin C/C++ kääntäjä?

Koska C++:n tarkoitus on olla mahdollisimman yleispätevä kieli taitaville ohjelmoijille ja BlitzBasicin tarkoitus on olla helpompi ja käytännöllisempi mutta rajoittuneempi kieli amatööreille.

DumTom kirjoitti:

Mulla on nyt yksi Blitz peli valmistumaisillaan ja seuraavan haluan tehdä kyllä C/C++:lla ja SDL:llä.

Ei ole mitään tarvetta koodata C++:lla, jos ei osaa – tai vaikka osaisikin. Helpommat kielet on keksitty sitä varten, että niillä olisi helpompi ohjelmoida.

Ei myöskään ole järkevää käyttää SDL:ää (ykkösversiota), se on hyvin vanhanaikainen ja hidas kirjasto. Parempia vaihtoehtoja ovat esimerkiksi SDL 2 ja SFML 2.

DumTom [10.04.2013 23:55:06]

#

Kiitos vastauksesta. Vain yksi kohta sai minut hieman suutahtamaan mutta toivuin nopeasti!:)

Metabolix kirjoitti:

Lähinnä viestistäsi tuli mieleen, että mahtaa olla vaikea koodata, jos ei vain yhtään osaa eikä ymmärrä. Voisi olla avartavaa perehtyä konekieleen (assembly) ja tietokoneen toimintaan sekä peruskäsitteisiin muistista (pino eli stack, keko eli heap).

Jos googlaat mun oikean nimen niin sieltä jotain löytyy mitä minä osaamaton olen saanut aikaiseksi. Esimerkiksi entisen suomipelit.comin Pokerin kaikki piirtorutiinit on tehty assemblyllä. Tiedän periaatteet joilla tietokone toimii. Pino ja pino-osoitin ovat tuttuja. Keosta en todella tiedä mitään muuta kuin että se on Heap.
Opiskelin nuorena commodoren konekieltä ja myöhemmin ammattikoulussa olin priimus tam8085 konekielessä. Ohjelmoitavia logiikoitakin olen ohjelmoinut vielä sekavammalla tavalla kuin op koodeilla onnistuneesti(vanhat schielen logiikat).

Arvelinkin että Blitz3D on sisältä aivan jotain muuta kuin uskoisi. Kiitos tuosta strict vinkistä!
En tarvitse seuraavaan projektiini suurtakaan nopeutta joten SDL 1 kelpaa minulle.

Minulla on tahto oppia C++. Olen laiska myönnän sen. Löytyisikö tuosta std::vectorista suomenkielistä kirjallisuutta?

Metabolix kirjoitti:

DumTom kirjoitti:

[DOSissa] Pystyi jopa esittelemään oliotaulukoita globaalisti.

Mikään ei estä tekemästä ihan samaa Windowsissakin, vaikkei se olekaan hyvä tapa. Kuten sanoin, std::vector on tässä hyödyllinen.

Sanot nyt että mikään ei estä tekemästä samaa windossissakin....Kumma kun olit viime vuoden heinä-elokuussa että globaalit oliotaulukot sotkevat windowsin jollain tavalla??????

Keskeneräisiä windows pelejä minulla on vaikka kuinka monta mutta en ole niitä viitsinyt jatkaa tuon edellisen asian takia ja siitäkin syystä että se pallopeli kaatuili SDL:llä lopulta aina.

Mitä ohjelmointikieltä suosittelet peliohjelmointiin jos et pidä minua kykenevänä oppimaan C++:aa?

Basicilla en tee varmaan tämän samaisen pallopelin jälkeen enää mitään.

Javako? Vai mikä tai mitkä?

Javasta ei ainakaan kirjallisuus lopu.

Mitä eroa on Javalla js JavaScriptillä?

Ja vielä loppuun ehkä suurimmista saavutuksestani maininta. Rakensin Atari St:lle strategiapelin jossa oli maksimissaan 4 ihmispelaajaa ja pelasimme sitä kaverieni kanssa tuntitolkulla. Pelin nimi oli Art of War ja se otti oppia neljästä suositusta strategiasta ja vuosi taisi olla 1994.


Vastauksesta tuli sekava mutta toivottavasti jatkamme sanailua ja minä viitsin oppia jotain! Kaikella kunnioituksella....:)

Metabolix [11.04.2013 01:00:06]

#

DumTom kirjoitti:

Jos googlaat mun oikean nimen niin sieltä jotain löytyy mitä minä osaamaton olen saanut aikaiseksi.

Tarkoitin tietenkin osaamista ja tietoa nykyaikaisesta muistinkäytöstä, jota lähes koko viestisi käsittelee, enkä kaikkea osaamista. Tosin kyllä näitä keskustelujasi (yksinkertaisia asennusongelmia, puuttuvia koodirivejä, ongelmia alkeellisessa matematiikassa) katsoessa joutuu välillä ihmettelemään, miten olet joskus saanut tuollaista aikaan vai onko nykyään laiskuus vallalla ja netissä kysyminen liian helppoa.

Joka tapauksessa sinun olisi hyödyllistä selvittää, miten dynaaminen muistinvaraus toimii, mikä on nykyaikaisen käyttöjärjestelmän rooli siinä ja mistä asioista ohjelmoijan pitää itse huolehtia. Nämä asiat ovat muuttuneet merkittävästi jostain DOS-ajalta Commodoresta puhumattakaan varsinkin siinä suhteessa, että aiemmin harmittomat tai enintään omituiset virheet voivat nykyään kaataa ohjelman.

DumTom kirjoitti:

Minulla on tahto oppia C++. Olen laiska myönnän sen.

Se on erittäin huono yhdistelmä. C++ on kieli, jota pitää ymmärtää hyvin ja käyttää harkiten, koska ohjelmointivirheistä ei tule selvää virheilmoitusta vaan "kaatuminen ilman syytä" – vaikka tietenkin syy on koodarissa ja viallisessa koodissa.

DumTom kirjoitti:

Löytyisikö tuosta std::vectorista suomenkielistä kirjallisuutta?

Löytyisikö tuosta sivupalkista hakukone?

DumTom kirjoitti:

Kumma kun olit viime vuoden heinä-elokuussa että globaalit oliotaulukot sotkevat windowsin jollain tavalla?

En ole sanonut näin. Esitin silloin arvauksen, että jotkin virheelliset objektien väliset riippuvuussuhteet kaataisivat ohjelman. Vika ei siis silloin ole suoranaisesti globaaleissa olioissa vaan siinä, millä tavalla ne keskustelevat keskenään. Esimerkiksi jos A kutsuu tuhoutuessaan B:tä mutta B onkin tuhottu ensin, ohjelma voi kaatua.

// Jokin luokka:
struct T {
	~T();
	void f();
};

// Kaksi oliota:
T A, B;

// Olion tuhoutuessa ajettava koodi:
T::~T() {
	// Koodi käyttää molempia olioita:
	A.f();
	B.f();
}

Oletetaan, että B tuhotaan ensin. Sitten tuhotaan A, mutta se yrittääkin vielä kutsua funktiota B.f, mikä on selvästi virhe. Globaaleilla olioilla joku voisi kirjoittaa tällaisen koodin vahingossa, ja siksi kehotin luopumaan globaaleista muuttujista. Toki ristikkäisillä osoittimilla kikkailemalla voi silti tehdä samanlaisen virheen.

DumTom kirjoitti:

Mitä ohjelmointikieltä suosittelet peliohjelmointiin jos et pidä minua kykenevänä oppimaan C++:aa?

Kuten jo sanoin, ei ole kysymys pelkästään kykenemisestä tai osaamisesta. En itsekään alkaisi ensisijaisesti tehdä peliä C++:lla ilman erityistä syytä, koska monella muulla kielellä ohjelmointi on nopeampaa ja ennen kaikkea ohjelman levittäminen eri alustoille on helpompaa.

Jos on vain tarkoitus saada peli tehtyä, ensisijaisesti suosittelen kieltä, jonka osaat kunnolla. Ehkä BlitzBasicissa on ratkaisuja muihinkin sinua häirinneisiin puutteisiin, tai ehkä voit muuttaa ohjelmointityyliäsi niin, että puutteet eivät haittaa. (Esimerkiksi voithan siinäkin käyttää enemmän funktioita.) Toinen samantapainen vaihtoehto on FreeBASIC, jota varmaan itse käyttäisin, jos pitäisi tuon suvun kielistä valita.

Jos SDL:n grafiikkafunktioita vastaava taso riittää, tekisin pelin ehkä selaimelle JavaScriptilla (ja HTML- ja CSS-koodilla). Silloin peli toimii käytännössä kaikilla ja sen levittäminen on helppoa. Lisäksi käyttöliittymän voi tehdä nettisivuna, ja ohjelma myös toimii helposti joka käyttöjärjestelmällä, kunhan käytössä on nykyaikainen nettiselain.

DumTom kirjoitti:

Mitä eroa on Javalla ja JavaScriptillä?

Ne ovat aivan eri kielet ja toimivat aivan eri ympäristöissä. Java on ohjelmointikieli muiden joukossa. JavaScript on täysin eri ohjelmointikieli, jolla voi tehdä nettisivusta kokonaisen ohjelman. Yhteistä on lähinnä nimen alkuosa, pieni osuus syntaksista (kuten myös C:ssä ja PHP:ssä) ja ihan minimaalinen määrä perusfunktioita.

jalski [12.04.2013 09:21:28]

#

DumTom kirjoitti:

Basicilla en tee varmaan tämän samaisen pallopelin jälkeen enää mitään.

Miksi? Moderni Basic kääntäjä ei hirveästi eroa syntaksia lukuunottamatta toiminnallisuudeltaan C++ kääntäjästä. Itse kirjoittelen paljonkin asioita Basicilla, käytössä mm. MiniBASIC ja erinomainen thinBASIC.

DumTom [14.04.2013 15:23:56]

#

Mua kävi kiinnostaa tuo JavaScript.
Onko tuo thinBASIC ilmainen?

temu92 [15.04.2013 09:32:22]

#

DumTom kirjoitti:

Onko tuo thinBASIC ilmainen?

Voihan sinä itsekin sen tarkistaa.

P.S. Jos aiot ohjelmoijaksi opettele se Guuglen käyttö. Javascriptistäkin löytyy nykyään enemmän juttua kuin koskaan aiemmin.

Vastaus

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

Tietoa sivustosta