Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: All-in-one topikki (C)

Sivun loppuun

Juice [04.08.2004 23:44:33]

#

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"?

Heikki [04.08.2004 23:59:40]

#

2. Voi, mutta sinun on käytettävä jotakin lisäkirjastoa. Myös Assemblyllä homma hoitunee muistaakseni suht. yksinkertaisesti.

Metabolix [05.08.2004 13:30:45]

#

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';

Metabolix [05.08.2004 16:03:39]

#

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.
}

Deewiant [05.08.2004 16:58:27]

#

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.

Metabolix [05.08.2004 17:32:37]

#

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;
};

firebug [05.08.2004 18:58:47]

#

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.

Metabolix [05.08.2004 19:00:36]

#

Niin, kyllä minä neljän tavun lohkon ymmärtäisin, mutta tuossapa onkin kahdeksan tavun lohko (double = 8 tavua).

Ilmuri [06.08.2004 01:25:20]

#

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.

Metabolix [06.08.2004 01:30:50]

#

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).

Juice [06.08.2004 22:54:37]

#

Tungetaanhan samaan topikkiin vielä yks kyssäri. www.opengl.com, sieltäkö saa OpenGL:än? Aikamoinen sillisalaatti tuo sivu.

Metabolix [06.08.2004 23:51:40]

#

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.

Juice [07.08.2004 18:53:53]

#

Joo, niinpä on, Dev-Cpp ei vaan ole pahemmin huudellu.


Sivun alkuun

Vastaus

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

Tietoa sivustosta