Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taulukon koko parametrista

Sivun loppuun

Wusakko [16.12.2011 09:34:14]

#

Hei!

#define MAX_LUKUJA 10

void testi(int taulukonKoko = MAX_LUKUJA)
{
   printf("%d\n", taulukonKoko) //Tämä tulostaa consoleen 10
   int taulukko[taulukonKoko]; //Tämä ei onnistu virhekoodilla "unknown size"
}

int main()
{
   testi();
}

Yksinkertaisestettu koodini on tässä. Ongelmani on se, että en voi käyttää taulukonKoko-muuttujaa taulukon koon määrittämiseen. Mikäli laitan testi-funktion sisälle printf("%d\n", taulukonKoko);- komennon niin ohjelma tulostaa kuitenkin "10" consoleen. Eli taulukonKoko kuitenkin sisältää tuon 10. Onkohan taulukonKoko kenties jotain muuta tyyppiä kuin int ja kuinka muutan sen intiksi?

*edit: Ohjelmanhan voisi tehdä muullakin tavalla. Haluaisin kuitenkin toteuttaan ohjelman näin - mikäli mahdollista.

Mod. lisäsi kooditagit!

Teuro [16.12.2011 10:35:29]

#

Anna funktiolle (kutsuvaiheessa) parametrinä haluttu koko. Nythän funktiolle ei anneta mitään parametrejä.

jlaire [16.12.2011 10:58:11]

#

Onko kieli tosiaan C eikä C++?

$ gcc -Wall Wusakko.c
Wusakko.c:3: error: expected ‘;’, ‘,’ or ‘)’ before ‘=’ token
Wusakko.c: In function ‘main’:
Wusakko.c:11: warning: implicit declaration of function ‘testi’
Wusakko.c:12: warning: control reaches end of non-void function

C-kääntäjä ei tykkää =-merkistä, koska C ei tue valinnaisia parametrejä.

Lisäksi printf-riviltä puuttuu puolipiste etkä ole sisällyttänyt kyseisen funktion esittelyä.

Mikä on oikeasti se koodi jota yritit kääntää, mitä komentoa käytit ja minkä virheviestin sait? Arvailu on tylsää.

vuokkosetae [16.12.2011 10:59:18]

#

Eikös C:ssä taulukot määritetä käännösvaiheessa?

Muisti tarvitsee siis varata dynaamisesti.

jlaire [16.12.2011 11:06:02]

#

vuokkosetae kirjoitti:

Eikös C:ssä taulukot määritetä käännösvaiheessa?

Vanhoissa standardeissa joo, mutta C99 lisäsi tuen ajonaikaiselle koonmäärittelylle. Esimerkiksi tämä on validia:

int main(int argc, char **argv) {
   char foo[argc * 42];
}

Suunnilleen saman asian voi tehdä myös alloca:lla.

neau33 [16.12.2011 14:36:58]

#

Moi Wusakko!

testaa oheista viritelmää...

#include <stdio.h>
#define MAX_LUKUJA 10

void testi(int taulukonKoko = MAX_LUKUJA)
{
	int * taulukko;
	taulukko = new int[taulukonKoko];
	printf("Taulukon 'taulukko' koko: %d\n", taulukonKoko);
	printf("\r\n");

	for(int i=0;i<taulukonKoko;++i)
	{
		taulukko[i] = i * 10 + 10;
		printf("%d", i + 1);
		printf(". alkion indeksi(%d", i);
		printf(") arvoksi asetettiin ");
		printf("%d\n", taulukko[i]);
	}

	printf("\r\n");

}

int main()
{
	testi();
	return 0;
}

jlaire [16.12.2011 15:33:27]

#

Oheisessa viritelmässä on kaksi olennaista juttua. 1) Dynaamisesti voi varata muistia juuri sen verran kuin haluaa. Tämä saattaa tulla joillekin yllätyksenä. 2) Tuolla tavalla varattu muisti pitäisi myös vapauttaa itse, mutta varsinkin C++:ssa se on hyvin vaikeaa tehdä oikein ja tavallisen osoittimen sijaan olisikin parempi käyttää fiksua osoitinta tai std::vectoria.

Torgo [16.12.2011 16:27:14]

#

Oletan että kyseessä on C++. Tämä ainakin toimii mainiosti g++:lla käännettynä:

#include <cstdio>
#define MAX_LUKUJA 10

void testi(int taulukonKoko = MAX_LUKUJA) {
	printf("%d\n", taulukonKoko);
	int taulukko[taulukonKoko];
	for(int i=0; i<taulukonKoko; ++i) {
		taulukko[i] = i+1;
		printf("%d\n", taulukko[i]);
	}
}

int main() {
   testi();
}

jlaire kirjoitti:

Dynaamisesti voi varata muistia juuri sen verran kuin haluaa. Tämä saattaa tulla joillekin yllätyksenä.

Tuli yllätyksenä. Olen usein halunnut varata enemmän muistia, kuin mitä sitä on tarjolla. ;)

@Nea: delete [] taulukko; // auttaa tilkitsemään vuotoja


Sivun alkuun

Vastaus

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

Tietoa sivustosta