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!
Anna funktiolle (kutsuvaiheessa) parametrinä haluttu koko. Nythän funktiolle ei anneta mitään parametrejä.
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ää.
Eikös C:ssä taulukot määritetä käännösvaiheessa?
Muisti tarvitsee siis varata dynaamisesti.
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.
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; }
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.