Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: header filut

Sivun loppuun

bolio [10.11.2005 18:16:39]

#

Voisitteko valaista aloittelijaa. Eli kyse olisi header fileistä. Minulla on micosoftin visual studio .net ja opettelen sillä sekalaisesti (c++ ja vb) ohjelmointia. Siis kuinka näitä *.h tiedostoja (tai vastaavia) liitettään projektiin, missä ne on, mistä niitä saa, mitä kääntäjässä on, mitä muualla on ja mistä saapi tietoa niitten toiminnasta? Siis ihan yleisellä tasolla.

Jyri [10.11.2005 21:05:30]

#

Joa haluaa yleistä tietoa kääntäjän toiminnasta yms, niin google on aika hyvä mesta ;)

Siis *.h tiedostoja liitetään projektiisi ihan #include:lla, vai tarkoititko omia *.h tiedostoja? Eli haluatko itse luoda niitä vai ymmärsinkö kaiken päin perhealbumia?

Metabolix [10.11.2005 21:10:33]

#

#include lisää halutun tiedoston siihen kohti koodia. Yleensä .h-tiedostoissa on jotakin määrittelyjä. Yhtä hyvin voit laittaa näin:

#include <stdio.h>

int main(void)
{
  printf(
#include "printattava.xyz"
    );
  return 0;
}

Ja printattava.xyz:aan

"Hei, include toimii!"

squid [10.11.2005 21:14:54]

#

Miksi tuota tapaa ei koskaan käytetä vaikka pelin teossa, jossa kartta luetaan tiedostosta?

Jyri [10.11.2005 21:17:25]

#

Oho, en oo ennen tiennytkään että includella voi includeta mitä tiedostoja vain :)

Metabolix [10.11.2005 21:30:46]

#

squid: siksi, että noin se tiedosto lisätään käännösvaiheessa eikä kesken ohjelman, eli ei paljon auta.

Jäynis [10.11.2005 21:34:47]

#

Aina oppii uutta:)

squid [10.11.2005 21:35:01]

#

Mutta tuohan ajaa saman asian, kuin se, että se lisätään heti ohjelman alkaessa, jolloin et tarvitse sitä tehdä.

Metabolix [10.11.2005 21:41:23]

#

Häh?
Siis tässä on kaksi koodia, jotka toimivat tasan samalla tavalla:

lainaus:

peli.cpp

char taso[6][6] = {
"#####",
"#...#",
"#.#.#",
"#.#.#",
"##..#",
"#####"
};

lainaus:

peli.cpp

char taso[6][6] = {
#include "taso.lev"
};

taso.lev

"#####",
"#...#",
"#.#.#",
"#.#.#",
"##..#",
"#####"

Kummassakaan ei ladata mitään tiedostosta, ei kesken ohjelman eikä sen alussa. Molemmat tuottavat täsmälleen samanlaisen ohjelman aivan joka kannalta.

squid [10.11.2005 23:02:31]

#

Hmm, tulikin mieleen, missä kerrottaisiin jotain tuon moniulotteisen taulukon käytöstä. Suomeksi mielellään

bolio [11.11.2005 09:15:56]

#

Siis tiedän miten se koodiin laitetaan. Miten ne liitetään projektiin? Missä ne on? esim. stdio.h

Heikki [11.11.2005 10:26:43]

#

stdio.h:ssa on standardikirjaston funktioiden esittelyjä (esimerkiksi int foo(); on esittely ja kertoo, että funktion foo() toteutus on jossain). Tällöin kun kääntäjä saa eteensä printf()-funktiokutsun, se lukee tuosta otsikkotiedostosta että "ahaa, tuollainen funktio on jossain toteutettuna ja saa sellaiset ja sellaiset parametrit", sitten se tarkistaa että olet antanut oikeantyyppiset parametrit ja kääntää rivin. Käännöksen valmistuttua sitten ohjelmaan linkitetään C:n standardikirjasto josta kyseinen toteutus löytyy. Yhtä hyvin koodissa voisi myöhemmin olla kyseinen funktio myös ohjelmoituna.

Toivottavasti saat edes jotain selvää.

Edit. oho, en vastannutkaan kysymykseesi :)
Eli, itselläni stdio.h löytyy polusta /usr/include/stdio.h, Windowssilla yleensä käyttämäsi kääntäjän jostain alihakemistosta. Kun komennat #include <stdio.h>, esikääntäjä yksinkertaisesti vain kopio kyseisen tiedosto sisällön siihen kohtaan, jossai #include-rivi on, ja tämän jälkeen antaa koodin itse kääntäjän käännettäväksi. Mitään muuta et tarvitse "liittääksesi" niitä projektiin. Laitat vain include-rivin jokaisen .c / .cpp -tiedoston alkuun, jossa tiedoston sisältöä tarvitaan.

coaster [11.11.2005 13:13:38]

#

Heikki kirjoitti:

stdio.h:ssa on standardikirjaston funktioiden esittelyjä (esimerkiksi int foo(); on esittely ja kertoo, että funktion foo() toteutus on jossain). Tällöin kun kääntäjä saa eteensä printf()-funktiokutsun, se lukee tuosta otsikkotiedostosta että "ahaa, tuollainen funktio on jossain toteutettuna ja saa sellaiset ja sellaiset parametrit", sitten se tarkistaa että olet antanut oikeantyyppiset parametrit ja kääntää rivin. Käännöksen valmistuttua sitten ohjelmaan linkitetään C:n standardikirjasto josta kyseinen toteutus löytyy. Yhtä hyvin koodissa voisi myöhemmin olla kyseinen funktio myös ohjelmoituna.

Mistäs se linkkeri sitten löytää sen likitettävän osan?
Entäs jos on jokin itse tehty kirjasto tms. ?

Heikki [11.11.2005 14:08:47]

#

Oletusasetuksilla käännettäessä linkitetään C:n standardikirjasto mukaan. Kirjastojen sijainti on kääntäjä- ja alustakohtainen, minulla kirjastot ovat jossain päni /usr/lib:iä.

Itse tehdyssä kirjastossa on kaksi vaihtoehtoa. Joko kirjaston funktioiden toteutukset sisältävä .c-tiedosto otetaan mukaan projektiin ja käännetään kun muutkin osat käännetään, tai sitten käännetään kirjasto vaikkapa dynaamisesti linkitettäväksi kirjastoksi / jaetuksi kirjastoksi (Windowsin .dll ja Linuxin .so), ja sitten käännöksessä kerrotaan linkkerille mistä kyseinen kirjasto löytyy (Windowssissa taidetaan tarvita .dll:n lisäksi muitakin tiedostoja, Linuxissa gcc:lle riittää muistaakseni pelkkä .so). Tällöin dll/so-tiedosto on oltava ohjelman saatavilla ohjelmaa ajettaessa.

Metabolix [11.11.2005 20:57:27]

#

Tai sitten käännetään siitä oma .lib- tai .a-kirjastotiedosto ja kopioidaan se kääntäjän lib-kansioon ja otetaan mukaan linkkerin parametrilla -lKirjasto.

bolio [12.11.2005 11:55:46]

#

no ongelma olikin siinä, että c++ ohjeeni ovat niin vanhoja. Visual studiossa ei ole näitä kirjastoja joita yritin laittaa koodiin. Kumminkin löysin .h tiedistot (/vc7/include). Sain jopa tehtyä hello worldin vc7:lla. jee! kiitos avusta kaikille.

Metabolix [12.11.2005 11:59:32]

#

Niin, nykyään ei ole iostream.h:ta vaan pelkkä iostream.

Heikki [12.11.2005 17:35:33]

#

...jota käytettäessä on sitten muistettava, että esim. cout on std-nimiarvaruudessa, ja tulostus tehtävä esim. std::cout << "Hi", tai sitten määrittelemällä aluksi using namespace std / using std::cout.

Jaska [16.11.2005 09:17:14]

#

squid kirjoitti:

missä kerrottaisiin jotain tuon moniulotteisen taulukon käytöstä.

Varmaankin kaikissa C++:aa käsittelevissä alkeisoppikirjoissa. Ei moniulotteiset taulukot ole monimutkaisia. Ne ovat vain yksiulotteisia taulukkoja, missä jokainen taulukon alkio on taulukko. Tämän muistamalla tarvitsee vain osata käyttää yksiulotteisia taulukkoja.

JoinTuanJanohon [21.11.2005 17:12:20]

#

iostream:sta vielä sen verran, että jos koodi käyttää paljon tiedostoja, stdio.h:n fread- ja fwrite -funktioilla voi saada C++ -ohjelmaan kymmenkertaisen nopeuden.
Kyllä noita massiivisia ja kaiken kattavia olio-kirjastoja ovat hiki hatussa vääntäneet, mutta niiden testaaminen on jätetty puolitiehen. Mukavaa, kun ohjelma bugittaa, ongelmaa jäljittää puolivuotta, ja sitten se suppenee jonnekin valmiiseen oliokirjastoon.


Sivun alkuun

Vastaus

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

Tietoa sivustosta