Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Jälkeenpäin alustettava taulukko?

Daih [14.04.2010 20:17:52]

#

Eli olen nyt ohjelmoinnut javalla parisen kuukautta ja jättänyt c++:n vähemmälle ja nyt ei muistu yhtään mieleen, miten c++:lla toteutetaan taulukon alustaminen vasta jälkikäteen. Eli taulukko olisi valmiina, mutta sen koko määritelätisiin vasta myöhemmin, kuten javassa se on mahdollista toteuttaa

Javassahan se toteutetaan seuraavasti:

int[] taulukko;
int x = 10;

taulukko = new int[x];

PS: itselläni ei ole nyt käytössä C++:aa käsittelevää kirjaa niin en pysty sieltä katsomaan asiaa kuin vasta parin viikon päästä.

Metabolix [14.04.2010 20:24:36]

#

Osoittimilla ja dynaamisella muistinvarauksella.

int *taulukko;
taulukko = new int[12];
delete [] taulukko;

Muista aina vapauttaa.

Toinen mahdollisuus on vector-malliluokan käyttö, jolloin vapauttamisesta ei tarvitse itse huolehtia ja kokoa on helppo muutella useamminkin.

std::vector<int> luvut;
luvut.resize(12);

Vector-olion käsittely tapahtuu hakasuluilla taulukon tapaan, mutta jos sen haluaa välittää kokonaisena funktiolle, kannattaa käyttää viittauksia, joista myös kerrotaan oppaassa.

Deffi [14.04.2010 20:24:45]

#

int *taulukko;
int x = 10;

taulukko = new int[x];

delete[] taulukko; // ei saa unohtaa, tulee satikutia

Daih [14.04.2010 20:39:17]

#

Kiitoksia vastauksista ja nyt muistinkin miten tuo toimii. Samalla tuli kerrattua osoittimien ja viittausten käyttökin täältä löytyvästä opassarjasta.

Mutta nyt ongelmana on se, että miten luodaan moniuloitteinen taulukko? Tämä ei varmaankaan ole yhtä yksinkertainen operaatio, sillä esimerkit joita löysin netistä eivät yhtään oikeastaan avartaneet käsitystäni.

Metabolix [14.04.2010 20:48:40]

#

Kannattaa luoda yksiulotteinen taulukko ja laskea useasta indeksistä yksi kaavalla w*y+x, missä w on taulukon leveys. Toiminnallisuuden voi helposti pyöräyttää oman luokan sisään jotenkin tähän tapaan:

template <typename T> class taulu2d {
  int w, h;
  std::vector<T> data;
public:
  taulu2d(int _w = 0, int _h = 0): w(0), h(0) {
    resize(_w, _h);
  }
  void resize(int _w, int _h) {
    if (w < 0) w = 0;
    if (h < 0) h = 0;
    w = _w;
    h = _h;
    data.resize(w * h);
    // + datan siirto, jos kiinnostaa...
  }
  T const& operator() (int x, int y) const {
    return data[w * y + x];
  }
  T& operator() (int x, int y) {
    return data[w * y + x];
  }
};

taulu2d<int> t;
t.resize(13, 5);
t(1, 2) = 3;

Aiheesta on myös eräs paljon pidempi koodivinkki.

Daih [14.04.2010 21:01:13]

#

kiitoksia tästä esimerkistä ja alankin nyt soveltamaan tätä kolmiuloitteiseksi.

Vastaus

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

Tietoa sivustosta