Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Käsitinkö osoitinmuuttujat oikein?

Sivun loppuun

hunajavohveli [30.03.2004 18:18:06]

#

Eli siis kysyisin kokeneemmilta, olenko käsittänyt seuraavat asiat oikein. Sqwiik selostikin näitä, mutta en ole varma tajusinko.

Osoitinmuuttuja luodaan, kuten muuttuja, mutta eteen pistetään *
int *Osoitin;

Osoittin määritellään osoittamaan tiettyyn muuttujaan, ja tämän muuttujan eteen pistetään silloin &
Osoitin = &muuttuja_johon_osoitetaan;

Kun viitataan osoitinmuuttujan osoittaman muuttujan arvoon, pistetään eteen taas *
muuttuja2 = *Osoitin;

Ja sama toimii myös toisin päin
*Osoitin = 43285;

Eli ovatko nuo väittämäni totta? Jos ovat niin mitenkäs sitten saa määrittetyä osoitinmuuttujalle suoraan tietyn muistipaikan, eikä vain jonkin tietyn luodun muuttujan muistipaikkaa?

thefox [30.03.2004 21:42:36]

#

Kyllä, kaikki ovat silkkaa faktaa. Tuohon kysymykseesi:

int *Osoitin = (int *)0x31337;

hunajavohveli [31.03.2004 14:44:36]

#

No hyvä jos sitten käsitin, ja hyvin Sqwiik selittikin. Kuulosti vain niin monimutkaiselta aluksi, etten uskonut ymmärtäväni. Mutta nyt kysyisin vielä, että mikä on se näyttömuistin osoite? Muistaakseni Sqwiik sanoi, että sen saisi näin:

int *Osoitin = (int *)0xa0000000;

Tai sitten tuossa oli joku aivan muu kyseessä. Ja sitten olisi vielä kiva tietää, miten vaihdetaan näyttö grafiikkatilaan, niin että näyttömuistin käsittely yleensä vaikuttaa mitään. Sitä en oikein vielä käsittänyt, vaikka Sqwiik neuvoikin.

Edit: Ja ovatko nuo osoitteet muuten heksoja?

hunajavohveli [31.03.2004 19:03:59]

#

Niin ja onko nopeampaa käyttää tuota

*Osoitin = 842398;
näyttömuistin säätämiseen, vai kannattaisiko käyttää outportb:tä? Eikös se ole periaatteessa sama, kuin QB:n OUT?

Markus [31.03.2004 19:18:10]

#

Älä hyvä ihminen kirjoita mitään suoraan näyttömuistiin. Niin tehtiin viimeksi DOS:n aikakaudella.

Käytä grafiikan piirtämiseen käyttöjärjestelmäsi piirtofunktioita tai jotain grafiikka API:a kuten SDL, OpenGL, DirectDraw tai Direct3D.

hunajavohveli [31.03.2004 19:30:09]

#

Eli siis jotain valmiskirjastoja? Olen melkein aina lähtenyt ohjelmoinnissa siitä, että kaikki mikä voidaan, tehdään alusta alkaen itse. Siinä oppii mielestäni paljon paremmin. Ja sitä paitsi, eikö C++:lla voi tehdä kaiken, mitä noillakin? Onhan nuokin joidenkin pitänyt koodata.
Edit: Vai tyhjästäkö ne on nyhtäisty? Ja yritätkö väittää, etteivät nuo DirectX:t ja OpenGL:t käsittele näyttömuistia?

T.M. [31.03.2004 19:35:34]

#

Käytä valmiita kirjastoja siksi, koska ne ovat 100x nopeampia kuin omatekemäsi funktiot. Ja et hyödy siitä mitään jos alat vääntämään grafiikanpiirtofunktioita itse. Aikaa kuluu vain toiset 10 vuotta ennenkuin saat tehtyä edes kunnollisen pelin.

sqwiik [31.03.2004 19:38:11]

#

Osoiteet ovat heksoja, aivan oikein.
Näyttötilaa saa vaihdettua vaikka textmode-funktiolla (conio.h), tai sitten asm:lla

asm{
  MOV AX, 13H 'Näyttötila 320x200x256
  INT 10H     'Keskeytys
}

Ainakin moodilla 0X13 (13H) tuo näyttömuistin käsittely on melko nopeahkoa. outportb tekee saman kuin muistiosoitteeseen viittaus, ja on hitaampi (vain hitusen).

hunajavohveli [31.03.2004 19:38:29]

#

No kai tässä sitten on ruvettava niitä käyttämään. Mitenkäs niitä sitten käytetään?
Edit: Tai Sqwiik, mitä mieltä olet asiasta itse, kun neuvoit, miten grafiikkaa saisi piirrettyä? Käytätkö itse valmiita kirjastoja?

Markus [31.03.2004 19:42:34]

#

> C++:lla voi tehdä kaiken, mitä noillakin?

Vain jos käyttöjärjestelmä sen sallii. Käyttöjärjestelmä voi estää ohjelmaa käymästä suoraan käsiksi johonkin resurssiin esim. näyttömuistiin. Jolloin täytyy käyttää jotakin käyttöjärjestelmän funktiota asian suorittamiseksi.

> Onhan nuokin joidenkin pitänyt koodata.

Kyllä. Näytönohjaimesi ajurien kirjoittajien. (lukuunottamatta SDL:ää)

> etteivät nuo DirectX:t ja OpenGL:t käsittele näyttömuistia?

Kyllä, mutta tavalla, jolla näytönohjaimesi valmistaja on tarkoittanut, ja käyttävätpä vielä laitteistokiihdytystä, jolloin ne toimivat jopa 300 kertaa nopeammin (tutkittu fakta), mitä itsekirjoittamasi funktiot koskaan toimisivat.

hunajavohveli [31.03.2004 19:48:22]

#

Eli ne eivät siis ole C++:lla koodattuja? No mitenkä niitä käytetään?

sqwiik [31.03.2004 19:50:44]

#

Hunaja - en käytä valmiita kirjastoja. (Muuta kuin erästä, joka on go32. Muistin käsittelyyn, näet)
Jos haluat saada aikaan laadukasta jälkeä, joka on nykypelian tasolla, kannatan kirjastojen käyttöä. Suorilla muistiviittauksilla voi saada aikaan pahaakin jälkeä, ja näyttömuistin suora peukalointi on korkeammissa näyttötiloissa hitaampaa kuin kirjaston käyttö.

Eli valitse tilanteen mukaan.

hunajavohveli [31.03.2004 19:54:50]

#

No kai tässä sitten pitää ruveta kirjastoja käyttämään, jos kerran suoralla käsittelyllä voi mennä kone sekaisin. Voisittekos te, jotka olette jo näillä koodanneet, antaa jotain ohjeita, tai vaikka osoitteita, mistä tietoa saisi?

Markus [31.03.2004 19:55:37]

#

>Eli ne eivät siis ole C++:lla koodattuja?

Varmaan tehty assemplyllä? Voivat olla C:lläkin, mutta käytetylla kielellä ei ole mitään väliä.

> No mitenkä niitä käytetään?

Jokainen grafiikka API tarjoaa sinulle nipun valmiita funktioita, joita voit käyttää. Samoin kuin standardi C tarjoaa esim. printf()-funktion tekstin tulostukseen.

Saadaksesi funktiot käyttöön sinun on liitettävä API:n otsikko tiedosto mukaan #include-käskyllä (Esim. OpenGL:ssä #include <gl\gl.h>).
Sitten linkkaat ohjelmasi tarvittavien kirjastojen kanssa (Esim. OpenGL:ssä opengl32.lib).

Hyviä OpenGL tutoriaaleja löytyy sivulta nehe.gamedev.net ja www.opengl.org
DirectX tietoa löytyy msdn:stä msdn.microsoft.com

hunajavohveli [31.03.2004 20:03:09]

#

#include <gl\gl.h>

main()
{
}

Kirjoitin ihan testiksi tuollaisen ja kirjasto kyllä näyttäisi löytyvän, mutta pukkaa virhettä, kuten:
Declaration Syntax Error
Multiple Declaration for 'WINGDIAPI'
Earlier Declaration for 'WINGDIAPI'

Mitenkä tuo linkkaaminen muuten tehdään?

Edit: Ja kääntäjä antaa ymmärtää että virheet löytyvät OpenGL:stä eikä koodistani (no ei siihen kyllä niitä mahtuisikaan)

Markus [31.03.2004 20:08:43]

#

Tarvitsee varmaan windows.h mukaan. tai siiten kääntäjäsi mukana tulleessa kirjastossa on jokin virhe.

#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>

int main(void)
{
return 0;
}

> Mitenkä tuo linkkaaminen muuten tehdään?

Riippuu kääntäjästä.

hunajavohveli [31.03.2004 20:09:57]

#

Minulla on Borland C++
Edit: Tuo koodi toimii.
Mitenkä niitä grafiikkafunktioita sitten käytetään?

Markus [31.03.2004 20:29:24]

#

> Minulla on Borland C++

En ole koskaan kyseistä kääntäjää käyttänyt, joten en osaa sanoa kuinka sillä linkataan, mutta jossakin kääntäjän asetuksissa on varmaan kohta "linker" tai jotain vastaavaa, johon voi kirjoittaa mukaan linkattavien tiedostojen nimet. Tutki kääntäjän ohjeista.

> Mitenkä niitä grafiikkafunktioita sitten käytetään?

Mene osoitteeseen nehe.gamedev.net ja ala käydä siellä olevia tutoriaaleja läpi yksi kerrallaan.

edit: Ainiin joissakin nehen tutoriaaleissa käytetään apuna glaux-kirjastoa. ÄLÄ KÄYTÄ SITÄ. Se on vanhentunut roska.
Eli poista vain
#include <gl\glaux.h>
rivi olettaen, että yhtään sen funktiota ei itseasiassa käytetä missään.

hunajavohveli [31.03.2004 20:38:43]

#

Tarvitaanko tässä nyt jokin Visual C++ 6.0? Ainakin niin tuo sivu antaa ymmärtää.

Markus [31.03.2004 20:58:20]

#

hunajavohveli kirjoitti:

Tarvitaanko tässä nyt jokin Visual C++ 6.0? Ainakin niin tuo sivu antaa ymmärtää.

Ei. Itse olen saanut nuo esimerkit kääntymään (tosin pienin muutoksin) ainakin neljällä eri kääntäjällä.

hunajavohveli [31.03.2004 21:13:56]

#

Voipi olla, että en ole ihan valmis vielä noihin. Koodia oli niin paljon, etten millään pysty sulattamaan sitä kerralla. Sitä paitsi Borland (jota siis et ole käyttänyt?) mielestäni ei oikein tue noita kaikkia asioita.

thefox [01.04.2004 10:12:50]

#

Toivottavasti kääntäjäsi on nyt siis Windows-pohjainen (ei DOS). Näyttötilojen vaihto keskeytyksillä (kuten Sqwiik näytti) ei toimi esim. Windowsin alla.

Jos haluat esim. DJGPP:llä tehdä 32-bittisiä DOS-ohjelmia niin voit käyttää keskeytyksiä (DJGPP:n funktioiden kautta) näyttötilan asettamiseen vaikkapa legendaariseksi 320x200:ksi 256:lla värillä ja piirrellä suoraan näyttömuistiin osoitteeseen 0xA0000.

Ja edelleen, osoitteet voi antaa normaalisti desimaali-, heksadesimaali- tai oktaalimuodossa.

Jos haluat tehdä jokaikisen pikselinpiirron käsin, joudut silti tekemään jonkinlaisen systeemin käyttöjärjestelmän grafiikkafunktioilla. Esim. Windowsilla GDI:lläkin pääsee 2D:ssä ihan mukavaan suoritusnopeuteen, eikä kukaan pakota käyttämään esim. BitBlt:ä. Itse käyttäisin kyllä Windowsilla melkeinpä ainoastaan jotain kirjastoa.

edit: Ihmettelen kyllä jos Borland ei NeHen tutoriaaleja käännä, taitaapa siellä olla monelle tutoriaalille ihan valmiit paketitkin.

hunajavohveli [01.04.2004 15:09:59]

#

Ongelma tulee heti siinä OpenGL-ikkunan luomisessa.
Tuosta rivistä valittaa, että "Type name exptected"

boolactive=TRUE;// Window Active Flag Set To TRUE By Default

Edit: Ovatko muuten SDL tai DirectX yhtään helpompia? Kun tuo koodi menee vielä vähän yli hilseen.

Edit: Ja löytyihin sieltä koodi Borlandille. Lataan sen suoraan ja katson uudestaan, onko tuota samaa ongelmaa.

thefox [01.04.2004 18:46:25]

#

OpenGL:n opiskelun kannalta ei ole olennaista että tajuat NeHen pohjakoodin. Tärkeä tavara menee päälooppiin. Koodi voi vaikuttaa vaikealta koska et tiedä mitä mikäkin funktio tekee ja Windowsin struktuurit näyttävät varmasti sekavilta mutta loppupeleissä koodissa ei ole mitään erikoista -- se vaatii vain hieman kokemusta Windows-ohjelmoinnista (API).

EDIT: tarkennettakoon vielä että NeHen pohjakoodi on kyllä jo ihan kommentien liikakäytön vuoksi erittäin sekavaa :-)

hunajavohveli [02.04.2004 14:28:13]

#

Muuten kai pelaa, mutta VCL.h ei löydy. Tarvitaanko sitä? Ainakin käynnistyy ilmankin.

thefox [06.04.2004 12:31:20]

#

Ei kai sitä tarvita, se on vaan noita Borlandin GUI-härveleitä (samaa tavaraa mitä Delphi käyttää). Sama ottaa koko #include-rivi pois jos se kerran turhaan siellä on.


Sivun alkuun

Vastaus

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

Tietoa sivustosta