#include <iostream> ... using namespace std; cout << "Mistä pitäisi etsiä vikaa, jos tämä tulostusvirtaan kirjoittaminen vaikuttaa ohjelman muuttujien arvoihin?!";
Kerro toki lisää.
Tulostus toimii oikein, mutta muuttaa double-tyyppisen taulukon arvoja toisessa oliossa. Muuttujien arvot säilyvän entisellään niin kauan kun mitään ei tulosteta. :D
Hmm... Ehkä taulukon muistialue ei ole suojattu oikein ja tulostusvirtaan kirjoittaminen ylikirjoittaa sen...?
Eli siis toimiiko tämä oikein sinulla?
#include <iostream> #include <ctime> #include <cstdlib> double d_taulukko[10]; int main() { std::srand(std::time(NULL)); for (int i = 0; i < 10; ++i) { d_taulukko[i] = rand() % 10 + 1; std::cout << d_taulukko[i] << std::endl; } return EXIT_SUCCESS; }
Vähän saman tyyppinen ohjelma kuin minulla, paitsi taulukko on toisessa oliossa. Oikeita lukuja tuo näyttää tulostavan.
9 8 10 2 10 9 1 10 7 6 Process returned 0 (0x0) execution time : 0.078 s Press any key to continue.
Laitatko tuon koodin esille? Samalla voisin suositella suoraan vektoria (std::vector) käyttämistä helpottaa monia asioita.
Koodi on pitkä, mutta periaatteessa toiminto on tämä:
- Kaksi saman luokan oliota.
- Luokassa on double-tyypin taulukko.
- Olio 1:ssa alustetaan olio 2. Konstruktori täyttää olio 2:n taulukon numeroilla.
- Olio 1:ssa on osoitin, joka viittaa olioon 2, ja jonka kautta tutkitaan olio 2:ta.
- Aluksi olio 2:n taulukko on kunnossa: Sieltä saadaan numerot, joilla se on täytetty.
- Kun olio 1:ssa tulostetaan jotain (cout), ja luetaan olio 2:n taulukkoa, saadaankin satunnaisdataa.
- Olio 2:n muut jäsenmuuttujat pysyvät ennallaan.
Voitko näyttää edes tuon luokan esittelyn voisi auttaa eteenpäin. Muutoin olion kautta olion käsittely ei tunnu järkevälle, kun molemmat ovat saman luokan olioita.
Kuulostaa siltä, että laitat osoittimen osoittamaan paikalliseen muuttujaan, jota ei enää seuraavan aaltosulun "}" jälkeen olekaan, vaan muisti käytetään uudestaan muihin tarkoituksiin. Tämän parempaa arvausta ei voi ilman koodia esittää. (Voit laittaa koko koodin vaikka pastebiniin.)
Ehkä kannattaisi lukea ajatuksella C++-opassarjasta muuttujien elinajat.
Ahaa! Pelkkä osoittaminen ei siis auta pitämään oliota "hengissä", kuten viittaaminen javassa.
if(van>0){ Liiketaulukko uusivanhempi(sis, van-1); vanhempi = &uusivanhempi; } //vanhempi on mennyttä
Juu, ei toimi noin. C++ ei sisällä Javan tavoin automaattista muistinhallintaa. Automaattisesti luodut oliot tuhoutuvat koodilohkon lopussa, ja new-operaattorilla luodut oliot vastaavasti pitää muistaa omin pikku kätösin tuhota deletellä, tai ne jäävät muistiin asustamaan aina ohjelman sammumiseen asti.
Toimii. Kiitos, ei näistä selviä enää ilman lääkäriä.
PS. Tästä pitäisi tulla eräänlainen geneettinen algoritmi. Siksi osoittimen nimi on "vanhempi".
Aihe on jo aika vanha, joten et voi enää vastata siihen.