Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Moniulotteinen dynaaminen taulukko

Sivun loppuun

Cc [05.11.2006 13:09:26]

#

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;

FooBat [05.11.2006 13:24:52]

#

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/11152-moniulotteiset-oliotaulukot-ja-funktiot-cpp

Cc [05.11.2006 21:57:42]

#

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

Metabolix [05.11.2006 22:13:17]

#

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.

Cc [05.11.2006 22:28:46]

#

Miten sitten luodaan kaksiuloitteinen taulukko, jos tuo on yksi uloitteinen?

Blaze [05.11.2006 22:37:25]

#

/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ä.

Cc [05.11.2006 22:56:23]

#

Kiitos avusta sain ohjelmani toimimaan.

koo [08.11.2006 23:35:02]

#

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ä!


Sivun alkuun

Vastaus

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

Tietoa sivustosta