c++, miten saan muutettua taulunkokoa jälkeenpäin pienemmäksi ja saako sen taulukon koon jotenki kätevästi selville vai pidänkö sen selvillä erillisellä muuttujalla?
Taulukon koon muuttamisesta jälkeenpäin en tiedä mutta koon selvittämiseen voi käyttää sizeof() functiota (joka taitaa olla valmiina c++:ssa joten ei tarvitse include:ta mitään.).
Se palauttaa taulukon viemän muistin määrän (olikos tavuina) ja jos sen jakaa taulukon tyypin viemällä muistimäärällä niin saadaan taulukon koko selville.
esim.
#include <iostream> using namespace std; int main() { int taulukko[10] //Luodaan int tyyppinen taulukko cout "Taulukon koko on: " << sizeof(taulukko)/sizeof(int); //Jaetaan taulukon koko int -tyypin koolla. return 0; }
Taulukon kokoa ei varsinaisesti voi muuttaa jälkeenpäin. Haluttaessa muuttaa taulukon kokoa, täytyy uudenkokoiselle taulukolle varata muistia, kopioida vanhan taulukon sisältö sinne ja tuhota vanha taulukko
int *taulukko = new int[10]; //muutetaan taulukon kokoa int *t2 = new int[20]; for(int i=0; i<sizeof(taulukko)/sizeof(int) && i<sizeof(t2)/sizeof(int); i++) t2[i] = taulukko[i]; delete [] taulukko; taulukko = t2; // vapautetaan muisti delete [] taulukko;
Jos tarvitset taulukkoa, jonka kokoa täytyy muuttaa, kannattaa käyttää (esim. STL:n) linkitettyjä listoja.
En tykkää taulukoista, se on taidegallerioiden pahin vitsaus! -- Ääh, vappuputki saisi jo pian ruveta katkeamaan...
C-tyylinen taulukko on sellainen otus, ettei sen kokoa pysty C++:ssa muuttelemaan. Jos kokoa ei tiedä etukäteen tai sitä pitää pystyä muuttamaan jälkikäteen, käytä std::vector
ia. Sinä on monen sortin size
t ja resize
t.
Muutoin C-tyylisen taulukon koon voi päätellä a) käyttämällä samaa vakiota, jota käytettiin taulukon esittelyssäkin; b) vääntämällä sopivan yleiskäyttöisen templaattiapufunktion ja -luokan; tai c) käyttämällä kieli keskellä suuta zormin näyttämää sizeof
-konstia.
os, esittelemäsi koodi a) ei toimi (esim. sizeof(taulukko)
) ja b) vuotaa muistia, jos sattuu poikkeuksia. Uskokaa nyt, vector
on ihan mietitty juttu.
Oho. Olisi pitänyt tutustua sizeof
iin vähän tarkemmin.
Esittämäni koodi kuitenkin a) toimii, jos sizeof(taulukko)/sizeof(int)
:n korvaa jollakin muuttujalla, johon taulukon koko on tallennettu, ja b) poikkeusten käsittelyn voi kyllä halutessaan lisätä tähänkin koodiin.
Eipä ole olleet omat koodiesimerkkinikään ihan virheettömiä, ei, mutta jauhan nyt tästä jutusta kumminkin vielä:
Tuo a-bugi on tosiaan simppeli korjattava. B-pulman korjaaminen vaatisikin tietämystä siitä, mitä muuta oikeasti oltaisiin tekemässä. Tuossa lyhyessä pätkässä homma näyttää vielä niin kovin yksinkertaiselta. Koodi on kuitenkin hirmu haurasta, ajatellaan nyt vaikka sitäkin, että mitä siinä pitää muuttaa, jos int
in sijasta taulukon tyypiksi halutaan long
tai vaikka mytype
. Taitaa olla niin, että tuossa pätkässä noiden juttujen lisäksi on c) vähän koko design pielessä.
Se, että kyseessä on vain esimerkki, ei ihan kelpaa selitykseksi, sillä
std::vector<int> taulukko(10); taulukko.resize(20);
tekee tismalleen samat jutut kuin tuo aiempi pätkäkin, mutta oikein. Se on lisäksi on joustavampi eikä virheenkäsittely taulukon osalta riipu siitä, mitä muuta oikeasti meinataan tehdä.
Pikkuisen on pitänyt omaa päätäkin takoa seinään näissä kuvioissa, ennen kuin nämä C++-jutut alkoivat mennä jakeluun. Poikkeusten käsittelyä ei oikeastaan lisätä koodiin, vaan poikkeusturvallisuus rakennetaan sisään designiin. Jos sanon koodissa new
, tulos sijoitetaan aina auto_ptr
iin tms. haltijaan, enkä edes muista, milloin olisin viimeksi käyttänyt taulukkomuotoista new
:ta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.