1. Koska suurin osa ohjelmista kirjoitetaan C:llä, niin missä kohti ohjelmoijat tekevät yleensä virheen ja ohjelma kaatuu? Alustamattomat osoittimet?
2. Voiko C++:lla saada ääniä kuulumaan piipperin kautta
3. Jos koodin kääntää dll-kirjastoksi niin miten siitä "luetaan tietoja"?
2. Voi, mutta sinun on käytettävä jotakin lisäkirjastoa. Myös Assemblyllä homma hoitunee muistaakseni suht. yksinkertaisesti.
1. Alustamattomat osoittimet, osoittimet, jotka on alustettu, mutta joiden osoittama objekti on tuhottu, joissakin tapauksissa muuttujien loppuminen, esim. Baldur's Gate sisälsi tämän bugin kunnes se lopulta korjattiin. Sitten kullakin omat outoutensa, nykyään entistä enemmän graafisen puolen ongelmia, kun jokin näytönohjain toimiikin eri tavalla. Monessakin pelissä on fiksailtu näitä "Ati Radeon xxxx caused a break drawing shiny water" tms.
2. Kyllä, mutta tosiaan, lisäkirjastojen avulla, esim. Windowsissa #include <windows.h> ja Beep(taajuus, millisekuntia); Assemblyä ei voi windowsissa käyttää juuri mihinkään.
3. C:ssä en tiedä, mutta Pascalissa homma on helppo (kuten kaikki muukin):
function OmaFunktio(A, B: Integer): Integer; external 'OmaDll.dll' name 'FunktionNimiDllssa';
Laitanpa tänne omankin kysymykseni:
Miksi sizeof(TPiste) antaa arvon 72, mutta jos jätän Dimensionin pois, se antaa 64?
class TPiste { private: double posX, posY, posZ; // 3 * 8 = 24 double movX, movY, movZ; // 3 * 8 = 24 double degSivu, degYlos; // 2 * 8 = 16 // Tässä yht 64 unsigned char Dimensions; // 1 * 1 = 1, eikö? // Tässä yht 65, mutta sizeof sanoo 72. // 68 vielä ymmärtäisin, mutta tätä en. }
Metabolix kirjoitti:
Laitanpa tänne omankin kysymykseni:
Miksi sizeof(TPiste) antaa arvon 72, mutta jos jätän Dimensionin pois, se antaa 64?
Mielenkiintoista tosiaankin. Taitaa olla jotenkin muistinkäsittelystä kiinni, lisäsin nimittäin pari charia perään ja koko oli vieläkin 72. Vasta sitten kun laitoin 8 charia lisää (eli niin monta, että koko olisi oikeasti 73 joka on siis yli 72), koko muuttui. 80:ksi. Olisiko niin, että jos yksi muistilohko on 8 charin kokoinen, loppujenkin pitää olla?
Tein lisää testejä. Tein classin, jossa on yksi double ja yksi char. Koko oli 16. Sitten tein toisen, jossa on ensin 7 charia ja sitten yksi int. Koko oli 12. Eli int oli 4, neljä charia yhdistettiin toiseksi neljäksi eli 8, ja sitten kolme charia yhdistettiin myös neljäksi ja 12.
Enpä tiedä miksi se on noin, mutta noin näyttäisi olevan.
Sen saa näköjään menemään pienempään tilaan tietyillä kääntäjän asetuksilla (VC++:ssa vaikkapa "#pragma pack (tavumaara)", mutta VC++:n ohjeet sanovat ettei sitä tule missään tapauksessa muuttaa jos ei välttämättä tarvitse. Ehkäpä Windowsin on nopeampaa hakea niitä muistista, jos ne ovat saman kokoisia. Aika hassua sinänsä... Seuraavista S on 8 tavua ja T 12 tavua:
struct S { char a; char b; int c; }; struct T { char a; int c; char b; };
Muistaakseni tuo johtuu sellaisesta ilmiöstä kuin muistin tasaaminen. 4 tavun lohkoissa varattuna muisti on nopeampaa käsitellä. Tosin en muista tätä ollenkaan tarkasti, joten vastaus saattoi mennä metsään.
Niin, kyllä minä neljän tavun lohkon ymmärtäisin, mutta tuossapa onkin kahdeksan tavun lohko (double = 8 tavua).
Jossain Lamothen kirjassa oli structien kokonaiskoon pitämisestä kahden potensseissa (no lähinnä 8,16 ja 32). Kahden potenssit tosiaan näyttävät olevan aina hieman nopeampia.
Lähinnä se on kyllä tuo neljän tavun lohko, ihan sen takia, että prosessorin rekisterit ovat kooltaan neljä tavua.
Palatakseni kuitenkin alkuperäisiin kysymyksiin:
Tutkiskelin tässä hieman, ja totesin, että "malloc", jolla muistia "vanhalla" C:llä tehdyissä peleissä varataan, on hieman vaarallinen. Sen kanssa pitää olla hyvin tarkkana, ettei yritä vapauttaa muistia, jota ei ole varattu (josta kai seuraa kaatuminen), tai jätä varattua muistia vapauttamatta (josta seuraa muistin täyttyminen ja hieman epävarmempi kaatuminen).
Tungetaanhan samaan topikkiin vielä yks kyssäri. www.opengl.com, sieltäkö saa OpenGL:än? Aikamoinen sillisalaatti tuo sivu.
No on tosiaan... Mitä kääntäjää käytät? Ainakin kaikissa kaupallisissa tulee OpenGL-headerit mukana.
Kokeilepa vaikka #include "GL/gl.h"
Lisäksi haku saattaa antaa tästäkin tuloksia, taikka sitten suomipelit.comissa sijaitseva OpenGL-tutoriaali.
Joo, niinpä on, Dev-Cpp ei vaan ole pahemmin huudellu.
Aihe on jo aika vanha, joten et voi enää vastata siihen.