C++ -kysymykset

Muu yhteisön välinen keskustelu.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Galgoneer wrote:
Jani wrote:miten suoritan C++ ohjelman komentoriviltä?
Samalla tavalla kuin minkä tahansa muunkin ohjelman: kirjoittamalla sen nimen (mahdollisesti polkuineen, ellet ole oikeassa kansiossa).
Voisitko esittää ongelmasi hieman tarkemmin?
elikkä saan sen auki komentamalla tiedosto.exe -o

mutta miten saan auki muodossa tiedosto.cpp?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

Sinun tulee ensin kääntää ohjelma.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

esa94 wrote:Sinun tulee ensin kääntää ohjelma.
??

eikö .cpp päätteistä pysty ajamaan mitenkään?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: C++ -kysymykset

Post by TheDuck »

Ei pysty ellet ala kikkailemaan kääntäjän avulla. (pitempiä komentoja)
^^
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

eli?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

.c ja .cpp tiedostot sisältävät vain lähdekoodin. Et saa niistä ajettavaa ohjelmaa ilman kääntäjää.
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Eli:
windowsiin en osaa sanoa yhden rivin komentoa, mutta linuxin puolella se onnistuisi (korvaa tietenkin hakasuluissa olevat jutut omillasi) :
gcc [lähdetiedostot] -o [ohjelman nimi] | ./[ohjelman nimi]

Windowsissa vastaavasti kahdella rivillä (olettaen että käytät MinGW:tä ja PATH on kunnolla asetettu):
gcc [lähdetiedostot] -o [ohjelman nimi]
[ohjelman nimi]

Siis jos ohjelmasi koostuu vaikkapa tiedostoista eka.cpp ja toka.cpp niin kääntäisit sen ohjelma.exeksi komennolla:
gcc eka.cpp toka.cpp -o ohjelma.exe
Ja voisit sitten suorittaa sen komennolla:
ohjelma.exe

Suosittelen tosin perehtymään makefileihin, jos aiot komentoriviä jäädä käyttämään.

Ja eihän CB:kään aja F5-napplulalla .cb-tiedostoja suoraan vaan kääntää ne ensin exe:ksi ja suorittaa sitten ks. exe:n. Kyseinen cbRun.exe löytyy normaalisti CoolBasicin IDE-kansiosta.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Onko mahdollista palata rivissä takaisin?

eli \n vaihtaa riviä, niin onko joku joka nostaa

?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Esimerkiksi tälläisellä funktiolla:

Code: Select all

void asetaKursori(int x=0,int y=0){
  COORD mesta = {x,y};
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),mesta);
}
Sorsaan pitää liittää windows.h.
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Tai linuxissa:

Code: Select all

cout<<"\x1b["<<rivi<<";"<<sarake<<"H";
"\x1b":n voi korvata myös "\e":llä. C-tyylillä tuo menisi

Code: Select all

printf("\e[%d;%dH",rivi,sarake);
Lisää tietoa wikipediasta
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Galgoneer wrote:Tai linuxissa:

Code: Select all

cout<<"\x1b["<<rivi<<";"<<sarake<<"H";
"\x1b":n voi korvata myös "\e":llä. C-tyylillä tuo menisi

Code: Select all

printf("\e[%d;%dH",rivi,sarake);
Lisää tietoa wikipediasta
käytän seuraavat 3 vuotta windowwsia.. ehkä.

EDIT: ei toiminut tuo asetaKursori funktio (vai mikä se nyt oli...)
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Jani wrote:ei toiminut tuo asetaKursori funktio (vai mikä se nyt oli...)
Jaa ei vai?

Code: Select all


  #include <windows.h>
  #include <iostream>
  
  using namespace std;
  
  void asetaKursori(int x=0,int y=0)
  {
    COORD mesta = {x,y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),mesta);
  }
  
  int main(int argc, char *argv[])
  {
    asetaKursori(10,6);
    cout << "Dead man walking..\n";
    asetaKursori(10,5);
    cout << "Here we go.";
    cin.get();
  }

E: Oho, tää oli mun 1337. viesti :D
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Kiitos!

Voiko funktion tallentaa toiseen tiedostoon?

Siis jotenkin näin:

Code: Select all

// Ohjelma.cpp

#include <iostream>
#include "funktio.cpp"

using std::cout

int main(void) {
    Teksti();
}

Code: Select all

//funktio.cpp

char Teksti() {
    cout << "Funktio";
}
Onko muuta tapaa koska tuo ei toimi?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Älä liitä .cpp vaan .h tai .hpp tiedostoja. Sellaisen sisältö voisi olla vaikka tälläinen:

Code: Select all

// * test.h

#ifndef test_H
#define test_H

// Tänne sisältö ...

#endif  // test_H
Jotkut luovat vielä .cpp tiedoston erikseen toteutuksille, mutta minun mielestäni se on täysin turhaa eikä selkeytä mitään. Tuohon samaan filuun voi ihan hyvin sysätä kaiken.

Muista sitten liittää kaikki tarvittavat kirjastot päämoduulissasi ihan koodin alussa niin ei tule turhaa työtä.
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Grandi wrote:Älä liitä .cpp vaan .h tai .hpp tiedostoja. Sellaisen sisältö voisi olla vaikka tälläinen:
Jotkut luovat vielä .cpp tiedoston erikseen toteutuksille, mutta minun mielestäni se on täysin turhaa eikä selkeytä mitään. Tuohon samaan filuun voi ihan hyvin sysätä kaiken.
Krhm... Sen tarkoituksena ei välttämättä olekaan niinkään selkiyttää vaan se on useissa tapauksissa muutenkin järkevää.
Oletetaan, että koodisi koostuu kahdesta moduulista ja ne molemmat sisällyttävät saman header-tiedoston, jonne joku älypää on mennyt tunkemaan koodiakin. Tällöin molemmat moduulit tulevat sisältämään samat funktiot ja niistä linkitetty exe tulee sisältämään saman funktion kahdesti.

Itseasiassa vastaavasta ongelmasta oli juuri kysymys: Oletan että Jani käytti IDEä, jossa nuo molemmat tiedostot olivat osa projektia. Kääntäjä käänsi ensiksi ohjelma.cpp:n, joka sisälsi includen takia Teksti()-funktion. Sen jälkeen kääntäjä käänsi vielä funktio.cpp:n joka sisältää myös Teksti()-funktion. Nyt kääntäjä ei osaa enää jatkaa, koska sillä on kaksi Teksti()-funktiota. Jos yllä olevassa tapauksessa haluaa välttää header tiedoston käyttöä, voisi menetällä seuraavasti:

Code: Select all

// Ohjelma.cpp

//iostreamia ei tarvitse sisällyttää tähän, sillä mainin ei tarvitse tietää kuin Teksti funktion olemassa olosta
void Teksti(); //Tämä olisi normaalisti header tiedostossa, mutta voi sen sijoittaa tähänkin.
//Tämä siis kertoo että on olemassa Teksti()-funktio.


int main(void) {
    Teksti();
}

Code: Select all

//funktio.cpp
#include <iostream> //Teksti()-funktio tarvitsee iostreamin funktioita
/* Tähänkin voi halutessaan liittää tuon rivin:
void Teksti();
joka kertoisi että se on olemassa myös tälle funktiolle */
void Teksti() { //en tiedä miksi tyyppinä oli char, koska funktio ei kerran palauta mitään?
    std::cout << "Funktio";
}
Header-tiedostojen tarkoitus on kertoa, että jotakin on olemassa jossakin, niiden ei tule itse sisältää varsinaisia toteutuksia (paitsi inline-funktiot).
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: C++ -kysymykset

Post by Sami The Great »

Grandi wrote:Älä liitä .cpp vaan .h tai .hpp tiedostoja. Sellaisen sisältö voisi olla vaikka tälläinen:

Code: Select all

// * test.h

#ifndef test_H
#define test_H

// Tänne sisältö ...

#endif  // test_H
Jotkut luovat vielä .cpp tiedoston erikseen toteutuksille, mutta minun mielestäni se on täysin turhaa eikä selkeytä mitään. Tuohon samaan filuun voi ihan hyvin sysätä kaiken.

Muista sitten liittää kaikki tarvittavat kirjastot päämoduulissasi ihan koodin alussa niin ei tule turhaa työtä.
Pääasiassa toteutus tehdään cpp tiedostoon, koska .h tiedostot täytyy kääntää joka kerta uudestaan kun ohjelma käännetään.
Kun cpp tiedostossa on toteutus se käännetään vain kun sitä on muutettu ja käännös vaiheessa aiemmin käännetyt cpp käännökset vain linkitetään lopulliseen exeen. Tämä nopeuttaa kääntämistä, jos sitä tehdään toistuvasti.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: C++ -kysymykset

Post by temu92 »

Jani wrote:Voiko funktion tallentaa toiseen tiedostoon?
http://www.ohjelmointiputka.net/koodit_ ... unnus=1770
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Olisiko jokin järkevämpi tapa toteuttaa tämä?

Code: Select all

#include <iostream>

using namespace std;

class Testi {
    public:
        string nimi;
        int ika;
        void ITiedot();
        void YTiedot(int l=0);
        void APiste(int p) { Piste=p; }
        int PalautaPiste() { return Piste; }
        int operator+(Testi& t) { return Piste + t.PalautaPiste(); }
    private:
        int Piste;
};

void Testi::ITiedot() { cout << "Nimi: " << nimi << ", ikä: " << ika << "\n"; }

void Testi::YTiedot(int l) { if (l<1) cout << "Yritys: " << nimi << "\n"; }

int main() {
    Testi p; Testi y;
    p.nimi="Ilkka"; p.ika=45; p.APiste(10); p.ITiedot();
    y.nimi="A1Autoväri"; y.APiste(10); y.YTiedot(0);
    cout << "\n\nPisteet yhteensä: " << p+y;
    cin.get();
}
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Noita metodeja voisi jaotella eri riveille ihan selkeyden kannalta ja voisit luoda konstruktorin noiden joidenkin tietojen asettamiselle. Silloin nuo kaikki luokan sisältämät muuttujat voisivat olla privatessa. Jos taas et tarvi tälläisiä ominaisuuksia niin voit tietenkin C-mäisesti käyttää struktuurejakin.

E: Kiitos muuten Galgoneerille ja Sami The Greatille väärän tiedon korjaamisesta ;-)
Last edited by Koodiapina on Tue Dec 30, 2008 2:49 pm, edited 2 times in total.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Yritän tehdä jonkinlaista tekstipeliä mutta miten saan sen tarkastamaan painalluksen?
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Post Reply