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.
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?
#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!"
Miksi tuota tapaa ei koskaan käytetä vaikka pelin teossa, jossa kartta luetaan tiedostosta?
Oho, en oo ennen tiennytkään että includella voi includeta mitä tiedostoja vain :)
squid: siksi, että noin se tiedosto lisätään käännösvaiheessa eikä kesken ohjelman, eli ei paljon auta.
Aina oppii uutta:)
Mutta tuohan ajaa saman asian, kuin se, että se lisätään heti ohjelman alkaessa, jolloin et tarvitse sitä tehdä.
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.
Hmm, tulikin mieleen, missä kerrottaisiin jotain tuon moniulotteisen taulukon käytöstä. Suomeksi mielellään
Siis tiedän miten se koodiin laitetaan. Miten ne liitetään projektiin? Missä ne on? esim. stdio.h
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.
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. ?
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.
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.
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.
Niin, nykyään ei ole iostream.h:ta vaan pelkkä iostream.
...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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.