C++ -kysymykset

Muu yhteisön välinen keskustelu.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Galgoneer wrote:Lisäksi minua ärsyttää tuo tapa laskea kahden samalla akselilla olevan pisteen etäisyys distance-funktiolla, kun on olemassa operator- eli perus miinuslasku ( tyyliin x2-x1, lienee hieman kevyempi, kuin turhat potenssiin korotukset ja neliöjuuret )
Ei kai se noin yksinkertaista voi olla? Ainakaan funktiosi ei toiminut.
Galgoneer wrote:Aika paljon turhaa tuohon teit
Itseasiassa en. Käänsin vain erään toisen henkilön tekemän funktion C++:lle. Ja kuten sanoin, en itse tajua tästä matematiikasta mitään, joten en voi oikein optimoidakkaan ymmärtämättä miten homma toimii.

Ja kaipaisin nyt siis ihan toimivaa funktiota :-|
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Grandi wrote:
Galgoneer wrote:Lisäksi minua ärsyttää tuo tapa laskea kahden samalla akselilla olevan pisteen etäisyys distance-funktiolla, kun on olemassa operator- eli perus miinuslasku ( tyyliin x2-x1, lienee hieman kevyempi, kuin turhat potenssiin korotukset ja neliöjuuret )
Ei kai se noin yksinkertaista voi olla? Ainakaan funktiosi ei toiminut.
Vaikka sanoit, että et matematiikasta mitään ymmärrä, laitanpa tähän kuitenkin selityksen, miksi se on noin:

Code: Select all

sqrt( (x2-x1)^2 + (y2-y1)^2 )  // tällä siis lasketaan etäisyys
jos y2=0 ja y1=0, niin lauseke sievenee seuraavasti:
sqrt( (x2-x1)^2 + (0-0)^2 ) //tässä on siis vain korvattu y2 ja y1 nollilla
sqrt( (x2-x1)^2 + 0 ) // 0-0=0 ja 0^2=0
sqrt( (x2-x1)^2) // nollan lisääminen ei vaikuta mihinkään, koska nolla luonteensa puolesta on kovin olematon
x2-x1 // neliöjuuri on vastatoimenpide toiseen korotukselle, joten sqrt(x^2)=x 
Joten kyllä se on ihan noin yksinkertaista. y-etäisyyden laskennassa vastaavasti x2-x1=0.
Grandi wrote: Ja kaipaisin nyt siis ihan toimivaa funktiota :-|
Kyllä se ainakin minulla toimii, kokeile vaikkapa funktiotani seuraavilla arvoilla:

Code: Select all

    cout << GetAngle(0,0,1,0) << endl; //pitäisi olla 0
    cout << GetAngle(0,0,1,1) << endl; //pitäisi olla 45
    cout << GetAngle(0,0,0,1) << endl; //pitäisi olla 90
    cout << GetAngle(0,0,-1,1) << endl; //pitäisi olla 135
    cout << GetAngle(0,0,-1,0) << endl; //pitäisi olla 180
    cout << GetAngle(0,0,-1,-1) << endl; //pitäisi olla 225
    cout << GetAngle(0,0,0,-1) << endl; //pitäisi olla 270
    cout << GetAngle(0,0,1,-1) << endl; //pitäisi olla 315
En sitten tiedä millaiset arvot noille kulmille haluat, jos tuo ei käy.
EDIT:

Näköjään coolbasicin GetAngle käyttää outoa koordinaatistoa, jossa y-akseli kasvaa alaspäin. Jos todellakin haluat käyttää tuollaista epästandardia käppyrää, senkun vain kutsut funktiota y-arvojen vastaluvuille, eli et kutsukaan GetAngle(x1,y1,x2,y2), vaan kutsut GetAngle(x1,-y1,x2,-y2). Suosittelisin kyllä käyttämään koordinaatistoa, jossa y kasvaa ylospäin mentäessä

Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Kyllä se tosiaan näyttää toimivan. Vika oli siinä, että nämä cos() ja sin() funktiot ottavat myös jotain ihmearvoja itselleen. Sain kuitenkin muokattua ne oikeiksi kun katsahdin paria tutoa.

Kiitos :-)
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: C++ -kysymykset

Post by KilledWhale »

Grandi wrote:Kyllä se tosiaan näyttää toimivan. Vika oli siinä, että nämä cos() ja sin() funktiot ottavat myös jotain ihmearvoja itselleen. Sain kuitenkin muokattua ne oikeiksi kun katsahdin paria tutoa.

Kiitos :-)
Ihmearvoja? Ettet vain radiaaneja meinaisi?
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

Möm. Näin ennen nukkumaanmenoa ajattelinpa tässä vähän virvoittaa tätä ketjua kysymällä kuinka saan selvitettyä kaikki tietyn luokan oliot?
As in, (mun lempisanonta <3) minulla on luokka Account, josta on luotu oliot Pena ja Paavo. Miten saan luokan perusteella selville, että siitä on luotu Pena ja Paavo?
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Esimerkiksi linkitetyillä listoilla. Itse kuitenkin käytän vektorisäiliöitä jolloin homma on hieman yksinkertaisempi.

Code: Select all

#include <vector>
#include <iostream>
using namespace std;

struct joku{ string nimi; };
vector<joku*> olio;
int jokut=0;

void luo_joku(string lol) {
    olio.push_back(new joku);
    olio[jokut]->nimi = lol;
    jokut++;
}

int main() {
    luo_joku("pentti");
    luo_joku("matti");
    luo_joku("ilmari");

    for (int i=0; i<jokut; i++) {
        cout << olio[i]->nimi << endl;
    }
}
En ole koodia taaskaan testannut, joten se kannattaa tarkistaa virheiden varalta ennen käyttöä. Se käyttää myös erillistä jokut-muuttujaa vector::iteratorin sijasta, joka voi haiskahtaa jonkun mielestä purkalta. Olen kuitenkin tottunut käyttämään tätä tyyliä eikä siitä ole haittaakaan ollut.

Huomautuksena vielä, että tämä ei siis tarkista kaikkia luokan olioita. Vain tuon taulukon.
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Grandi wrote: Se käyttää myös erillistä jokut-muuttujaa vector::iteratorin sijasta, joka voi haiskahtaa jonkun mielestä purkalta. Olen kuitenkin tottunut käyttämään tätä tyyliä eikä siitä ole haittaakaan ollut.
Itsekin toki tykkään käyttää enemmän perinteistä for-lausetta iteraattoreiden sijasta, mutta kun vektori tarjoaa sisältämiensä alkioiden määrän itsessään, niin miksi varata toinenkin muuttuja kuvaamaan sitä ;) Tässä hieman muoksittu koodi (lisäsin luokkaan myös rakentajan, jotta sai yhden rivin luomisesta pois :)

Eli ainakin tuo jokut muuttuja oli kovin turha:

Code: Select all

#include <vector>
#include <iostream>
using namespace std;

struct joku{ 
    string nimi; 
    joku(string nimi) : nimi(nimi){};    
};
vector<joku*> olio;

void luo_joku(string lol) {
    olio.push_back(new joku(lol));
}

int main() {
    luo_joku("pentti");
    luo_joku("matti");
    luo_joku("ilmari");

    for (int i=0; i<olio.size(); i++) {
        cout << olio[i]->nimi << endl;
    }
}
Periaatteesahan tämän voisi lisätä luokan sisäänkin, mutta silloin rajoittuisi vain yhteen listaan/vektoriin. Tässä toteutuksessa on tosin globaaleita muuttujia, joten ei tämäkään aivan hyvä ole. Vielä parempi voisi olla erillinen manageriluokka hallinnoimaan joku-olioita. Mutta en jaksa näihin kellonaikoihin enää mitään pidempää kirjoitella.
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda »

Tässä toteutuksessa on tosin globaaleita muuttujia, joten ei tämäkään aivan hyvä ole.
Tässä ei olisi globaaleja muuttujia käytetty:

Code: Select all

#include <vector>
#include <iostream>
#include <string>
using namespace std;

struct joku
{
    string nimi;
    joku(string nimi) : nimi(nimi){}  
};

void luo_joku(vector<joku*>& olio, const string& lol)
{
    olio.push_back(new joku(lol));
}

int main()
{
    vector<joku*> olio;

    luo_joku(olio, "pentti");
    luo_joku(olio, "matti");
    luo_joku(olio, "ilmari");

    for (int i=0; i<olio.size(); i++)
    {
        cout << olio[i]->nimi << endl;
    }
}
Näin luo_joku -funktio tulee myös entistä kätevämmäksi, koska sillä voi lisätä joitakin mihin tahansa sopivaan vektoriin.
OoO
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

Ohoh! Kiitos kaikille, varsinkin antille, joka teki tuon viimeisimmän. Nyt päästiin sitten itse asiaan :3

Luen muuten nyt Nineteen Eighty-Fouria, ja on hyvä kirja. Sattuu muuten olemaan vuoden 1950 painos!
EDIT:

Ääk, ongelma. Muokkasin anttipandan koodin niin, että se sopii koodiini, ja nyt on seuraava ongelma:

Code: Select all

void CreateAccount( vector<Account*>& acc, char * owner )
{
    acc.push_back( new acc( owner ) );
}
Heittää virheiloituksen:
sorsat\C++\PlopHack\bank.cpp||In function `void CreateAccount(std::vector<Account*, std::allocator<Account*> >&, char*)':
sorsat\C++\PlopHack\bank.cpp|85|error: `acc' is not a type
Account on luokka, jonka määrittely on:

Code: Select all

class Account {

    public:
        static int Accounts;
        Account( char* ownerName );
        //~Account();
        //void Credit( int amount );
        void Debit( int amount );
        void Info();
    private:
        float Balance;
        float Credit;
        char * Owner;
        int Number;

};
Mikä mättää?
EDIT:

Ai niin, olen mieltynyt C-merkkijonoihin, älkää niistä välittäkö.

[/edit]
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande »

Siinä mättää juuri se, mistä se valittaakin: 'acc' is not a type.

Et voi määritellä "new acc", vaan "new Account"

Tuo CreateAccount-funktio kannattaisi mahdollisesti heittää luokan sisään staattiseksi funktioksi, jolloin sen voisi nimetä pelkäksi Create-funktioksi.
TheFish
Developer
Developer
Posts: 477
Joined: Mon Aug 27, 2007 9:28 pm
Location: Joensuu

Re: C++ -kysymykset

Post by TheFish »

esa94 wrote:tekstiä, koodia ja edittejä
Yritänpä taas päteä asioista joista en tiedä mitään...

Code: Select all

acc.push_back( new acc( owner ) );
Tuon Account-luokan nimihän on tosiaan Account, ei acc, kuten kutsumasi konstruktori sanoo. En kyllä tiedä salliiko c/c++ konstruktorilla eri nimen kuin itse luokalla, mutta et ole nähdäkseni määritellytkään mitään acc()-konstruktoria luokassa.
CoolBasic henkilökuntaa
Kehittäjä
User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: C++ -kysymykset

Post by Dibalo »

Muistutan vielä, että dynaamisen muistin kanssa pelatessa täytyy vapauttaa varattu muisti ennen ohjelman loppua! Toisin sanoen siis tuhota luodut oliot.
The darkest spells can be found from
http://tunkkaus.blogspot.fi
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

@Galgoneer: Miten voin tehdä funktiosta luokan sisäisen, jos sillä luodaan itse olio?
@Galgoneer & TheFish: Extraseerioushups.
@Dibalo: Aivan, pidän mielessä.
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda »

esa94 wrote:Miten voin tehdä funktiosta luokan sisäisen, jos sillä luodaan itse olio?
Tekemällä siitä staattisen. Tuttu mm. Symbianin NewL ja NewLC -metodeista (curse them!). Esimerkiksi:

Code: Select all

class MunLuokka
{
    public:
        static MunLuokka* TeeTuntematon()
        {
            MunLuokka* self = new MunLuokka();
            self->nimi = "Tuntematon";
            return self;
        }
    private:
        string nimi;
};
...
MunLuokka* o = MunLuokka::TeeTuntematon();
OoO
vms100
Member
Posts: 81
Joined: Tue Aug 28, 2007 4:47 pm

Re: C++ -kysymykset

Post by vms100 »

Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

vms100 wrote:Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Ei toimi tuo "Testi"-funktio...
Toimiva:

Code: Select all

void Test()
{
    MessageBox(NULL,"Terve","Viesti")
}
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
vms100
Member
Posts: 81
Joined: Tue Aug 28, 2007 4:47 pm

Re: C++ -kysymykset

Post by vms100 »

Jani wrote:
vms100 wrote:Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Ei toimi tuo "Testi"-funktio...
Toimiva:

Code: Select all

void Test()
{
    MessageBox(NULL,"Terve","Viesti")
}
Kyl ainakin mulla kääntyy.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

vms100 wrote:
Jani wrote:
vms100 wrote:Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Ei toimi tuo "Testi"-funktio...
Toimiva:

Code: Select all

void Test()
{
    MessageBox(NULL,"Terve","Viesti")
}
Kyl ainakin mulla kääntyy.
Tuo sun vai mun?
Tuossa dllbase-tiedostossa on myös vikaa. Sitä ei saa auki.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: C++ -kysymykset

Post by phons »

Kuinka niin ei saa auki? Ja miten tuon dllbase:n saa .DLL muotoon kun sitä ei siinä ollut... En oikein ymmärrä näiden juttujen päälle.
Image
Guest

Re: C++ -kysymykset

Post by Guest »

Jani wrote:
vms100 wrote:Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Ei toimi tuo "Testi"-funktio...
Toimiva:

Code: Select all

void Test()
{
    MessageBox(NULL,"Terve","Viesti")
}
MessageBoxin vika parametri puuttuu, eikä siinä ole puolipistettä.

Korjattu:

Code: Select all

void Test()
{
    MessageBox(NULL, "Terve", "Viesti", MB_OK);
}
Post Reply