Miten luodaan/tuhotaan c++:lla hyvä ja turvallinen moniuloitteinen dynaaminen taulukko?
Itse kokeilen tälläistä tapaa:
int TaulukonKokoX, TaulukonKokoY; TaulukonKokoX = TaulukonKokoY = 0; int *taulukko = new int[TaulukonKokoX*TaulukonKokoY]; taulukko[0*0] = 0; cout << endl << taulukko[0*0] << endl << endl; delete [] taulukko;
Kyllä tuo sinunkin tapasi toimii, jos tietää mitä on tekemässä. Ei sitä kuitenkaan ihan turvalliseksi voi sanoa.
Eräässä aikaisemmassa ketjussa oli pari kolme aika hyvän näköistä ratkaisua.
https://www.ohjelmointiputka.net/keskustelu/
Kokeilin luoda samalla tekniikalla string taulukon ja sijoittaa siihen dataa ja tulostaa sen jälkeen taulukko, mutta tulee 'Muistialueen ylitys'. Mistä tämä johtuu itse en keksinnyt syytä tähän.
Koodi:
//Luodaan dynaaminen moniuloitteinen taulukko string *taulukko = new string[10*10]; //Sijoitetaan taulukkoon arvoja, jotta näemme, että taulukko toimii for (int i = 0; i < 10; i++) { for (int a = 0; a < 10; a++) { taulukko[a*i] = LueTiedosto("ristinolla.txt", (a+1)); } } //Tulostetaan taulukon sisältö, tarkistuksen vuoksi for (int i = 0; i < 10; i++) { for (int a = 0; a < 10; a++) { cout << endl << endl << taulukko[a*i] << endl << endl; } } //Vapautetaan taulukko delete [] taulukko;
Tässä on LueTiedosto -funktion koodi:
char *LueTiedosto(char *TiedostonNimi, int RiviNumero) { //Avataan tiedosto nimellä filu ifstream filu(TiedostonNimi); int rivit = 0; string rivi, lopullinen; //Luetaan loopissa tiedoston RiviNumero -sisältävä rivi ja palautetaan sen arvo while(!filu.eof()) { getline(filu, rivi); if (rivit == RiviNumero) { return (char *)rivi.c_str(); } rivit++; } //Suljetaan tiedosto filu.close(); }
Tuo käyttämäsi a*i
ei todellakaan ole kohta (a,i)
. Siinä pitäisi olla a*leveys+i
, missä leveys on nähtävästi kymmenen. Tähti on ihan tapotavallinen kertolasku, ei sen kummempi, ja tuo taulukko on aivan tavallinen yksiulotteinen taulukko.
Miten sitten luodaan kaksiuloitteinen taulukko, jos tuo on yksi uloitteinen?
/home/blaze/coding/ptr2ptrtest/test6.c, ollos hyvä:
#include <stdlib.h> #include <stdio.h> void test(int **oikeelalli, int ***oikeepalle) { int i = 0; // otetaan jotain apumuuttujia int *lalli; int **palle; lalli = malloc(10 * 10 * sizeof(int)); palle = malloc(10 * sizeof(int*)); for(i = 0; i < 10; i++) { palle[i] = lalli + (i * 10); } // sitte asetetaan alkuperäiset *oikeelalli = lalli; *oikeepalle = palle; } int main(void) { int *muuli = NULL; int **laama = NULL; int x, y; for(;;) { test(&muuli, &laama); for(x = 0; x < 10; x++) { for(y = 0; y < 10; y++) { laama[x][y] = x * y; } } for(x = 0; x < 10; x++) { for(y = 0; y < 10; y++) { printf("%i ", laama[x][y]); } printf("\n"); } printf("\n"); free(laama); free(muuli); } return 0; }
Joo, se on C:tä, mutta sikäli kun noita aiempia koodeja lukemalla näen, siitä tulee C++:aa korvaamalla mallocit new:llä ja freet deletellä.
Kiitos avusta sain ohjelmani toimimaan.
C++:ssa takuuvarmasti paras konsti dynaamisen moniulotteisen taulukon tekemiseen on kääräistä muistinhallinta ja muistialueen osoittelu luokkarajapinnan taakse. Muutoin rajapinta tehdään sellaiseksi, että alkioiden osoittelu näyttää sitten riittävän taulukkomaiselta. Tuolla FooBatin vinkkaamassa jutussahan näitä jauhettiin.
Blaze, esimerkistäsi ei tule C++:aa korvaamalla malloc
:it ja free
:t new
:illä ja delete
:illä. Siitä tulee ihan vaan kamalaa C++:lla kirjoitettua C:tä!
Aihe on jo aika vanha, joten et voi enää vastata siihen.