C++ -kysymykset

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

Re: C++ -kysymykset

Post by Koodiapina » Fri Jan 23, 2009 6:59 pm

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 :-|
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande » Sat Jan 24, 2009 4:20 pm

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ä


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

Re: C++ -kysymykset

Post by Koodiapina » Sat Jan 24, 2009 5:26 pm

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 :-)
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

User avatar
KilledWhale
Tech Developer
Tech Developer
Posts: 543
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: C++ -kysymykset

Post by KilledWhale » Sat Jan 24, 2009 6:15 pm

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 » Thu Feb 19, 2009 10:41 pm

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?

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

Re: C++ -kysymykset

Post by Koodiapina » Thu Feb 19, 2009 11:12 pm

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.
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande » Thu Feb 19, 2009 11:47 pm

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.

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Fri Feb 20, 2009 10:08 am

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 » Fri Feb 20, 2009 5:12 pm

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]

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: C++ -kysymykset

Post by Dande » Fri Feb 20, 2009 6:33 pm

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 » Fri Feb 20, 2009 6:34 pm

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 » Fri Feb 20, 2009 7:12 pm

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 » Fri Feb 20, 2009 10:45 pm

@Galgoneer: Miten voin tehdä funktiosta luokan sisäisen, jos sillä luodaan itse olio?
@Galgoneer & TheFish: Extraseerioushups.
@Dibalo: Aivan, pidän mielessä.

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Fri Feb 20, 2009 11:14 pm

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

User avatar
vms100
Member
Posts: 81
Joined: Tue Aug 28, 2007 4:47 pm

Re: C++ -kysymykset

Post by vms100 » Sat Feb 21, 2009 12:55 pm

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*

User avatar
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 5:53 pm

Re: C++ -kysymykset

Post by Jani » Sat Feb 21, 2009 1:32 pm

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

User avatar
vms100
Member
Posts: 81
Joined: Tue Aug 28, 2007 4:47 pm

Re: C++ -kysymykset

Post by vms100 » Sat Feb 21, 2009 10:06 pm

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.

User avatar
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 5:53 pm

Re: C++ -kysymykset

Post by Jani » Sat Feb 21, 2009 10:09 pm

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

User avatar
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: C++ -kysymykset

Post by phons » Sat Feb 21, 2009 11:24 pm

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 » Sat Feb 21, 2009 11:37 pm

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