Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tulostaminen muuttaa muuttujan arvoa

Sivun loppuun

jsbasic [04.11.2010 11:20:23]

#

#include <iostream>
...
using namespace std;
cout << "Mistä pitäisi etsiä vikaa, jos tämä tulostusvirtaan kirjoittaminen vaikuttaa ohjelman muuttujien arvoihin?!";

Jokotai [04.11.2010 11:51:03]

#

Kerro toki lisää.

jsbasic [04.11.2010 11:58:04]

#

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...?

Teuro [04.11.2010 12:10:54]

#

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;
}

jsbasic [04.11.2010 12:19:53]

#

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.

Teuro [04.11.2010 12:21:36]

#

Laitatko tuon koodin esille? Samalla voisin suositella suoraan vektoria (std::vector) käyttämistä helpottaa monia asioita.

jsbasic [04.11.2010 12:45:27]

#

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.

Teuro [04.11.2010 13:03:48]

#

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.

Metabolix [04.11.2010 14:05:45]

#

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.

jsbasic [04.11.2010 14:14:40]

#

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ä

Metabolix [04.11.2010 14:41:19]

#

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.

jsbasic [04.11.2010 16:36:36]

#

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".


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta